博客
关于我
【Spring IOC容器】Bean的生命周期
阅读量:333 次
发布时间:2019-03-04

本文共 2989 字,大约阅读时间需要 9 分钟。


文章目录


Bean的生命周期

一、概念

  • 简单的一句话来说bean的生命周期就是从对象创建到对象销毁的过程。

二、bean的生命周期

(1)通过构造器创建 bean 实例(无参数构造

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法

(3)调用 bean 的初始化的方法(进行配置初始化的方法

(4)bean 可以使用了(对象获取

(5)当容器关闭时候,调用 bean 的销毁的方法(进行配置销毁的方法


三、演示bean的生命周期

Ⅰ.创建Orders类

  • 声明属性
  • 编写无参构造器
  • 编写set()方法
  • 创建初始化方法
  • 创建bean销毁方法
public class Orders {       // 声明属性    private String oName;    // 1.无参构造    public Orders() {           System.out.println("第一步:执行无参构造器创建bean实例");    }    // 2.set    public void setoName(String oName) {           this.oName = oName;        System.out.println("第二步:调用set方法设置属性的值");    }    // 3.创建执行的初始化的方法 --- 在xml文件中配置    public void initMethod() {           System.out.println("第三步:执行初始化的方法");    }    // 5.创建执行的bean销毁方法    public void destroyMethod() {           System.out.println("第五步:执行销毁方法");    }}

Ⅱ.修改配置文件

  • 配置创建bean对象
  • 添加init-method属性,指定初始化方法
  • 添加destroy-method属性,指定销毁bean的方法

Ⅲ.编写测试类

public class Test {       @org.junit.Test    public void test_orders(){           try {               ApplicationContext context = new ClassPathXmlApplicationContext("Bean的生命周期/bean_Orders.xml");            // 4.获取bean实例对象            Orders orders = context.getBean("orders",Orders.class);            System.out.println("第四步:获取创建的bean实例对象");            // 5.手动销毁bean实例对象            ((ClassPathXmlApplicationContext)context).close();        } catch (Exception e){               e.getMessage();        }    }}

在这里插入图片描述


四、Bean 的后置处理器,bean 生命周期有七步

(1)通过构造器创建 bean 实例(无参数构造

(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法

  • 把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization

(3)调用 bean 的初始化的方法(进行配置初始化的方法

  • 把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization

(4)bean 可以使用了(对象获取

(5)当容器关闭时候,调用 bean 的销毁的方法(进行配置销毁的方法

▶ 演示添加后置处理器效果

(1)创建类,实现接口 BeanPostProcessor,创建后置处理器

public class MyBeanPost implements BeanPostProcessor {       /**     * 初始化之前调用     * @param bean     * @param beanName     * @return     * @throws BeansException     */    @Override    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {           System.out.println("在初始化之前执行的方法");        return bean;    }    /**     * 初始化之后调用     * @param bean     * @param beanName     * @return     * @throws BeansException     */    @Override    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {           System.out.println("在初始化之后执行的方法");        return bean;    }}

(2)修改配置文件

  • 只需要配置后置处理器类的bean对象即可,因为后置处理器类实现了BeanPostProcessor接口实现了后置处理器,那么后置处理器就会对当前配置文件中的所有bean都添加后置处理器的处理

在这里插入图片描述


五、Bean的生命周期 单例与多例 模式的对比

图一:

在这里插入图片描述
图二:
在这里插入图片描述

图三:

在这里插入图片描述
图四:
在这里插入图片描述

注意:不管后面有没有创建明确的对象,都会执行配置文件的方法和属性,因为以上是默认的单例模式(设置 scope 值是 singleton 时候),加载 spring 配置文件时候就会创建单实例对象;多例模式(设置 scope 值是 prototype 时候),不是在加载 spring 配置文件时候创建 对象,而是在调用getBean方法时候创建多实例对象,所以两者的生命周期有所不一样!

懒加载(lazy-init):

  • 取值有三个 default ,true ,false
  • 定义:
    • 当容器创建时就将对象也一起创建,就是非懒加载
    • 当我们需要使用改对象才加载的时候,就是懒加载
  • 优点:节省资源
  • 缺点:bug不容易暴露,需要到使用的时候才会发现要使用的类有问题
    • 单例模式默认非懒加载
    • 多例模式为懒加载


转载地址:http://wfeq.baihongyu.com/

你可能感兴趣的文章
mysql 多字段删除重复数据,保留最小id数据
查看>>
MySQL 多表联合查询:UNION 和 JOIN 分析
查看>>
MySQL 大数据量快速插入方法和语句优化
查看>>
mysql 如何给SQL添加索引
查看>>
mysql 字段区分大小写
查看>>
mysql 字段合并问题(group_concat)
查看>>
mysql 字段类型类型
查看>>
MySQL 字符串截取函数,字段截取,字符串截取
查看>>
MySQL 存储引擎
查看>>
mysql 存储过程 注入_mysql 视图 事务 存储过程 SQL注入
查看>>
MySQL 存储过程参数:in、out、inout
查看>>
mysql 存储过程每隔一段时间执行一次
查看>>
mysql 存在update不存在insert
查看>>
Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
查看>>
Mysql 学习总结(87)—— Mysql 执行计划(Explain)再总结
查看>>
Mysql 学习总结(88)—— Mysql 官方为什么不推荐用雪花 id 和 uuid 做 MySQL 主键
查看>>
Mysql 学习总结(89)—— Mysql 库表容量统计
查看>>
mysql 实现主从复制/主从同步
查看>>
mysql 审核_审核MySQL数据库上的登录
查看>>
mysql 导入 sql 文件时 ERROR 1046 (3D000) no database selected 错误的解决
查看>>