bean 的单例与多例

控制 bean 的单例与多例:

  • 简单对象:使用 bean 的 scope 属性,取值
    • prototype:多实例,原型模式
    • singleton:单实例,默认
  • 复杂对象:
    • FactoryBean的实现类的isSingleton()方法的返回值:true为单例,false为多例
    • 实例工厂和静态工厂:使用 bean 的 scope 属性

对象的生命周期

Spring 管理 bean 的其他细节 - 图1

对象的生命周期:指一个对象的创建、存活、消亡的一个完整过程

Spring的Bean的生命周期的3个阶段:

  1. 创建阶段:
    • scope=”singleton”时:Spring工厂创建的时候创建对象;如果需要该Bean在使用时才创建,使用 <bean lazy-init="true>"
    • scope=”prototype”时:Spring工厂会在获取对象的同时,创建对象
  2. 初始化阶段:Spring工厂在创建完对象后,会调用对象的初始化方法,完成对应的初始化操作初始化注意事项:
    • 初始化方法提供者:程序员根据需求,提供初始化方法
    • 初始化调用:Spring工厂创建完对象后进行调用
  3. 实现方式:

    • 相应类实现 Spring 的 InitializingBean 接口:public void afterPropertiesSet(){}
    • 相应类中提供一个普通方法,然后在配置文件中通过 init-method 属性指定:public void init(){}**
      1. <bean id="user" class="xx.User" init-method="init"/>
  4. 相应细节:

    1. 如果一个对象即实现 InitializingBean 同时又提供 普通的初始化方法,执行顺序时:先执行 InitializingBean ,然后再执行普通初始化方法
    2. 属性的注入一定发生初始化操作之前
    3. 初始化操作:一般用于完成资源的初始化操作,比如数据库、IO、网络等
  5. 销毁阶段:Spring销毁对象前,会调用对象的销毁方法,完成销毁操作(资源释放操作)实现方式:
    • 实现DisposableBean接口:public void destory() throws Exception{}
    • 定义一个普通的销毁方法:public void myDestory() throws Exception{}
      1. <bean id="user" class="xx.User" destory-method="myDestory"/>

注意事项:

  1. Spring在调用 context.close() 时才会进行对象的销毁
  2. 接口和普通方法同时使用时,先调用接口,然后才调用普通方法
  3. 销毁方法只适用于 scope=”singleton” 的对象
  4. 销毁操作:主要完成资源的释放

后置处理

1、BeanPostProcessor 接口:

  • postProcessBeforeInitialization:在 spring 创建完对象并进行属性注入后进行调用
  • postProcessAfterInitialization:在 spring 执行完对象的初始化操作后进行调用

    1. public class MyBean implements BeanPostProcessor {
    2. @Override
    3. public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    4. return bean;
    5. }
    6. @Override
    7. public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    8. return bean;
    9. }
    10. }

    2、在 xml 文件中进行配置:

    1. <bean id="my" class="xx.MyBean"/>

    注意:BeanPostProcessor会对Spring工厂中所有创建的对象进行加工,因此在使用时需要对传入的bean进行instanceof判别

配置文件参数化

配置文件参数化:把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中

  1. Spring的配置文件中需要经常修改的字符串信息:如数据库连接相关的参数
  2. 经常变化的参数,在Spring的配置文件中,不利于项目维护
  3. 更小的配置文件使用 properties 格式

实现步骤:
1、创建 jdbc.properties 小配置文件

  1. jdbc.username=root
  2. jdbc.password=1234
  3. jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false
  4. jdbc.driverClassName=com.mysql.cj.jdbc.Driver

2、Spring配置文件和小配置文件的整合

  1. <context:property-placeholder location="classpath:jdbc.properties"/>

3、使用 ${key} 对相应的属性进行获取