bean 的单例与多例
控制 bean 的单例与多例:
- 简单对象:使用 bean 的 scope 属性,取值
- prototype:多实例,原型模式
- singleton:单实例,默认
- 复杂对象:
- FactoryBean的实现类的isSingleton()方法的返回值:true为单例,false为多例
- 实例工厂和静态工厂:使用 bean 的 scope 属性
对象的生命周期
对象的生命周期:指一个对象的创建、存活、消亡的一个完整过程
Spring的Bean的生命周期的3个阶段:
- 创建阶段:
- scope=”singleton”时:Spring工厂创建的时候创建对象;如果需要该Bean在使用时才创建,使用
<bean lazy-init="true>"
- scope=”prototype”时:Spring工厂会在获取对象的同时,创建对象
- scope=”singleton”时:Spring工厂创建的时候创建对象;如果需要该Bean在使用时才创建,使用
- 初始化阶段:Spring工厂在创建完对象后,会调用对象的初始化方法,完成对应的初始化操作初始化注意事项:
- 初始化方法提供者:程序员根据需求,提供初始化方法
- 初始化调用:Spring工厂创建完对象后进行调用
实现方式:
- 相应类实现 Spring 的
InitializingBean
接口:public void afterPropertiesSet(){} - 相应类中提供一个普通方法,然后在配置文件中通过 init-method 属性指定:public void init(){}**
<bean id="user" class="xx.User" init-method="init"/>
- 相应类实现 Spring 的
相应细节:
- 如果一个对象即实现 InitializingBean 同时又提供 普通的初始化方法,执行顺序时:先执行 InitializingBean ,然后再执行普通初始化方法
- 属性的注入一定发生初始化操作之前
- 初始化操作:一般用于完成资源的初始化操作,比如数据库、IO、网络等
- 销毁阶段:Spring销毁对象前,会调用对象的销毁方法,完成销毁操作(资源释放操作)实现方式:
- 实现DisposableBean接口:public void destory() throws Exception{}
- 定义一个普通的销毁方法:public void myDestory() throws Exception{}
<bean id="user" class="xx.User" destory-method="myDestory"/>
注意事项:
- Spring在调用
context.close()
时才会进行对象的销毁 - 接口和普通方法同时使用时,先调用接口,然后才调用普通方法
- 销毁方法只适用于 scope=”singleton” 的对象
- 销毁操作:主要完成资源的释放
后置处理
1、BeanPostProcessor 接口:
- postProcessBeforeInitialization:在 spring 创建完对象并进行属性注入后进行调用
postProcessAfterInitialization:在 spring 执行完对象的初始化操作后进行调用
public class MyBean implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}
2、在 xml 文件中进行配置:
<bean id="my" class="xx.MyBean"/>
注意:BeanPostProcessor会对Spring工厂中所有创建的对象进行加工,因此在使用时需要对传入的bean进行instanceof判别
配置文件参数化
配置文件参数化:把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中
- Spring的配置文件中需要经常修改的字符串信息:如数据库连接相关的参数
- 经常变化的参数,在Spring的配置文件中,不利于项目维护
- 更小的配置文件使用 properties 格式
实现步骤:
1、创建 jdbc.properties 小配置文件
jdbc.username=root
jdbc.password=1234
jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
2、Spring配置文件和小配置文件的整合
<context:property-placeholder location="classpath:jdbc.properties"/>
3、使用 ${key} 对相应的属性进行获取