Bean标签
用于配置对象交由Spring创建,默认调用无参构造函数。
基本属性:
id:Bean实例在Spring容器中的唯一标识
class:Bean的全限定名称
范围配置
scope:对象的作用范围
取值范围 | 说明 |
singleton | 默认值单例 |
prototype | 多例 |
<!--一个示例-->
<bean id="userDao" class="com.littlepants.dao.impl.UserDaoImpl" scope="prototype"></bean>
Singleton:当Spring核心文件被加载时,实例化Bean实例,对象在应用加载创建容器时创建,只要容器在,对象就活着,当应用卸载,销毁容器时,对象就被销毁了。
Prototype:有多个实例,当调用getBean()方法时实例化,对象在被使用时创建,对象长时间不使用就被Java垃圾回收器回收了。
request、session、application、websocket:主要用于web应用中。
初始化与销毁
很多时候构造函数无法完成我们需要的初始化操作,这时候就可以使用初始化函数来完成。同理,销毁方法也可以完成一些额外的处理,类似资源处理和销毁回调。
<bean id="userDao" class="com.littlepants.dao.impl.UserDaoImpl" init-method="init" destroy-method="destroy"/>
懒加载
<!--全局设置,应用于所有所有的Bean-->
<beans default-lazy-init="true"></beans>
<!--个别设置,default属性继承自default-lazy-init-->
<beans id="userDao" class="com.littlepants.dao.impl.UserDaoImpl" lazy-init="true">
deafault-lazy-init 和lazy-init 拥有同样的取值(default, true, false),但是对于default而言,前者相当于false。
Bean定义继承
<!--父类-->
<bean id="people" class="com.little.People">
<property name="name" value="张三">
</bean>
<!--子类-->
<bean id="worker" class="com.little.Worker" parent="people">
<property name="company" value="恒大">
</bean>
跟继承一样,子类会包括父类的属性。当然,父类也可以加上abstract属性。这时,就不用填写class,作为抽象类使用。
依赖注入
依赖注入:将Bean依赖的类或普通值直接注入到Bean中,从而可以直接从Spring容器中通过访问Bean而直接访问它所依赖的部分,不用程序中再new新的实例,在一定程度上减少耦合。构造器注入和参数注入是依赖注入的主要方式。
<!--将List<String>类型,Map<String,User>,Properties类型注入UserDaoImpl-->
<bean id="userDao" class="com.littlepants.dao.impl.UserDaoImpl">
<property name="stringList"><!--name属性名称-->
<list>
<value>aaa</value><!--value注入普通属性值-->
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="userMap">
<map>
<entry key="user1" value-ref="user1"></entry><!--ref注入对象引用值-->
<entry key="user2" value-ref="user2"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="p1">ppp1</prop>
<prop key="p2">ppp2</prop>
<prop key="p3">ppp3</prop>
</props>
</property>
</bean>
<bean id="user1" class="com.littlepants.domain.User">
<!--构造器注入-->
<constructor-arg value=26>
<property name="name" value="Tom"/>
<property name="addr" value="Shanghai"/>
</bean>
<bean id="user2" class="com.littlepants.domain.User">
<property name="name" value="Jerry"/>
<property name="addr" value="Beijing"/>
</bean>
//User
//通过set、get方法实现依赖注入
public class User {
private int age
private String name;
private String addr;
public User(int age){
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", addr='" + addr + '\'' +
'}';
}
}
XML配置进阶
当需要配置大量Bean时,可以简写和多XML配置。
使用c、p命名空间可以分别对构造器注入和属性注入进行简写,在命名空间中加入相应的元素。
<!--xsi:schemaLocation不用加入,因为这还是属于Bean元素的定义-->
xmlns:c="http://www.springframework.org/schema/c"
xmlns:p="http://www.springframework.org/schema/p"
<!--构造器注入-->
<bean id="user" class="com.little.User" c:name="张三"/>
<!--属性注入-->
<bean id="user" class="com.little.User" p:age=26/>
<!--引入其他配置文件-->
<import resource="services.xml">
Bean的处理顺序
BeanFactoryPostProcessorBean的定义处理
构造器注入依赖对象
属性注入依赖
Aware相关接口和实现
BeanPostProcessor前置处理
是否继承InitializingBean接口
是否配置自定义的init-method
BeanPostProcessor后置处理
Bean存活并使用
容器销毁
是否继承DisposableBean接口
是否配置destroy-method
[参考文献]陈学明.Spring+Spring MVC+MyBatis整合开发实战[M].北京:机械工业出版社,2020:46-72.