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.