Spring中的bean标签详解
文章目录
- Bean标签基本配置
- Bean标签范围配置
- Bean生命周期配置
- Bean的依赖注入入门
- Bean的依赖注入概念
- Bean的依赖注入方式
- Bean的依赖注入的数据类型
- 引入其他配置文件(分模块开发)
Bean标签基本配置
用于配置对象交由Spring 来创建。
默认情况下它调用的是类中的无参构造函数,如果没有无参构造函数则不能创建成功。
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
Bean标签范围配置
scope:指对象的作用范围,取值如下:
取值范围 | 说明 |
---|---|
singleton | 默认值,单例的 |
prototype | 多例的 |
request | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中 |
session | WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中 |
global session | WEB 项目中,应用在 Portlet 环境,如果没有 Portlet 环境那么globalSession 相当于 session |
1)当scope的取值为singleton时
Bean的实例化个数:1个Bean的实例化时机:当Spring核心文件被加载时,实例化配置的Bean实例Bean的生命周期:
对象创建:当应用加载,创建容器时,对象就被创建了
对象运行:只要容器在,对象一直活着
对象销毁:当应用卸载,销毁容器时,对象就被销毁了
2)当scope的取值为prototype时
Bean的实例化个数:多个Bean的实例化时机:当调用getBean()方法时实例化Bean
对象创建:当使用对象时,创建新的对象实例
对象运行:只要对象在使用中,就一直活着
对象销毁:当对象长时间不用时,被 Java 的垃圾回收器回收了
Bean生命周期配置
init-method:指定类中的初始化方法名称
destroy-method:指定类中销毁方法名称
Bean的依赖注入入门
①创建 UserService,UserService 内部在调用 UserDao的save() 方法
public class UserServiceImpl implements UserService {@Overridepublic void save() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save();}}
②将 UserServiceImpl 的创建权交给 Spring
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl"/>
③从 Spring 容器中获得 UserService 进行操作
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save();
Bean的依赖注入概念
依赖注入(Dependency Injection):它是 Spring 框架核心 IOC 的具体实现。
在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。
IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。
那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。
简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取
Bean的依赖注入方式
①构造方法
创建有参构造
public class UserServiceImpl implements UserService {@Override
public void save() {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml"); UserDao userDao = (UserDao) applicationContext.getBean("userDao"); userDao.save();}}
配置Spring容器调用有参构造时进行注入
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl"> <constructor-arg name="userDao" ref="userDao"></constructor-arg>
</bean>
②set方法
在UserServiceImpl中添加setUserDao方法
public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao; } @Override public void save() { userDao.save();}
}
配置Spring容器调用set方法进行注入
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"/>
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl"><property name="userDao" ref="userDao"/>
</bean>
set方法:P命名空间注入
P命名空间注入本质也是set方法注入,但比起上述的set方法注入更加方便,主要体现在配置文件中,如下:首先,需要引入P命名空间:
xmlns:p="http://www.springframework.org/schema/p"
其次,需要修改注入方式
<bean id="userService" class="com.zjq.service.impl.UserServiceImpl" p:userDao-ref="userDao"/>
Bean的依赖注入的数据类型
上面的操作,都是注入的引用Bean,除了对象的引用可以注入,普通数据类型,集合等都可以在容器中进行注入。
注入数据的三种数据类型
普通数据类型
引用数据类型
集合数据类型
其中引用数据类型,此处就不再赘述了,之前的操作都是对UserDao对象的引用进行注入的,下面将以set方法注入为例,演示普通数据类型和集合数据类型的注入。
(1)普通数据类型的注入
public class UserDaoImpl implements UserDao {private String company;private int age;public void setCompany(String company) {this.company = company;}public void setAge(int age) {this.age = age;}public void save() {System.out.println(company+"==="+age);System.out.println("UserDao save method running...."); }
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"><property name="company" value="huawei"></property><property name="age" value="15"></property>
</bean>
(2)集合数据类型(List)的注入
public class UserDaoImpl implements UserDao {private List<String> strList;public void setStrList(List<String> strList) {this.strList = strList;}public void save() {System.out.println(strList);System.out.println("UserDao save method running....");}
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"><property name="strList"><list><value>aaa</value><value>bbb</value><value>ccc</value></list></property>
</bean>
(3)集合数据类型(List)的注入
public class UserDaoImpl implements UserDao {private List<User> userList;public void setUserList(List<User> userList) {this.userList = userList; }
public void save() {System.out.println(userList);System.out.println("UserDao save method running....");}
}
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"><property name="userList"><list><bean class="com.zjq.domain.User"/><bean class="com.zjq.domain.User"/><ref bean="u1"/><ref bean="u2"/> </list></property>
</bean>
(4)集合数据类型( Map<String,User> )的注入
public class UserDaoImpl implements UserDao {private Map<String,User> userMap;public void setUserMap(Map<String, User> userMap) {this.userMap = userMap;}
public void save() { System.out.println(userMap);System.out.println("UserDao save method running....");}
}
<bean id="u1" class="com.zjq.domain.User"/>
<bean id="u2" class="com.zjq.domain.User"/>
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"><property name="userMap"><map> <entry key="user1" value-ref="u1"/><entry key="user2" value-ref="u2"/></map></property>
</bean>
(5)集合数据类型(Properties)的注入
public class UserDaoImpl implements UserDao {private Properties properties;public void setProperties(Properties properties) {this.properties = properties;}public void save() {System.out.println(properties);System.out.println("UserDao save method running....");}
}
<bean id="userDao" class="com.zjq.dao.impl.UserDaoImpl"><property name="properties"><props><prop key="p1">aaa</prop><prop key="p2">bbb</prop> <prop key="p3">ccc</prop></props></property>
</bean>
引入其他配置文件(分模块开发)
实际开发中,Spring的配置内容非常多,这就导致Spring配置很繁杂且体积很大,所以,可以将部分配置拆解到其他配置文件中,而在Spring主配置文件通过import标签进行加载
<import resource="applicationContext-xxx.xml"/>
本文内容到此结束了,
如有收获欢迎点赞Spring中的bean标签详解相关推荐
- spring中context:property-placeholder标签详解
spring中context:property-placeholder标签的使用说明 1,有些参数在某些阶段中是常量. 在开发阶段我们连接数据库时的url,username,password等信息 分 ...
- spring(7)---深入理解Spring核心技术——Spring中的各模块详解
深入理解Spring核心技术--Spring中的各模块详解 Spring框架的两个基本概念IOC容器和AOP,相信大家现在对Spring中的这两个部分的基本概念有了一定的认识,好了,那么今天我们就来正 ...
- html中的mata标签详解
总是有很多朋友问我<meta name="author" content"xxxxx"><meta http-equiv="xx&q ...
- spring : springmvc常用注解标签详解(转)
新的项目,新的学习,好久没用这些注解了,同时在学习使用shiro ,lucene 等等.在网上找了些博文,感谢作者的总结和分享. 欢迎交流,言归正传: 1.@Controller 在SpringMVC ...
- HTML5中Head内标签详解(一):meta标签
引言: 我发现自己最近有点走偏了,越来越多的将学习的精力放在编程上,而渐渐的忽略了HTML这个简单又不简单的标记语言上.相信大家应该也有这样的经历.觉得HTML这种东西很简单不需要花费太多精力就能使用 ...
- Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
- HTML中的camera标签,详解HTML5 使用video标签实现选择摄像头功能
详解HTML5 使用video标签实现选择摄像头功能 1. html // jquery reference // // Open WebCam Snap Photo 2. javascript El ...
- Spring中的@Value注解详解
本文主要介绍Spring @Value 注解注入属性值的使用方法的分析,文章通过示例代码非常详细地介绍,对于每个人的学习或工作都有一定的参考学习价值 文章目录 概述 使用方式 基于配置文件的注入 基于 ...
- spring事务管理器的作用_【面试必问】Spring中的事务管理详解
在这里主要介绍Spring对事务管理的一些理论知识,实战方面参考上一篇博文: http://www.cnblogs.com/longshiyVip/p/5061547.html 1. 事务简介: 事务 ...
最新文章
- linux进入probe目录,Linux基础学习系列——Linux文件目录操作命令
- Windows Server 2008 定义用户桌面图标
- 测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题
- 亲历dataguard的一些经验问答题
- UA MATH564 概率论 计算至少有一个发生的概率:容斥原理与庞加莱公式
- python 自定义异常和主动抛出异常(raise)的操作
- python中的全局变量和局部变量
- 【javascript】四舍五入
- [zz]为 lua 封装 C 对象的生存期管理问题
- 微软正式释出基于 Chromium 的 Edge 预览版本
- elxel表格纸张尺寸_一本书的诞生:纸张知识
- Qt工作笔记-QCustomPlot让曲线动起来
- WDM驱动程序介绍(引)
- gvim配置文件参考
- 云上DevOps-CodePipeline,Packer和Terraform集成实践探索
- Infopath入门到精通系列-1 Infopath文件说明
- 相见恨晚的 18 个 Linux 趣味命令,最后一个千万要尝试~
- 无线通信数字调制技术
- unity3D 如何提取游戏资源
- OCR概述和CRAFT
热门文章