Spring的深入浅出--5.四种方式进行自定义bean的单实例和多实例初始化和销毁操作以及核心beanPostProcessor的底层源码实现

bean的生命周期:

bean创建---初始化---销毁的过程

容器管理bean的生命周期;

我们可以自定义初始化和销毁方法;容器在bean进行当前生命周期的时候来调用我们自定义的初始化和销毁方法

1)指定初始化和销毁方法:注解参数中指定init-method和destroy-method=“”

创建Car类

创建配置类@Configuration

加入car的bean方法

创建IOCTest_LifeCycle类

 运行:

 总结:

构造(对象创建)

单实例:

          懒汉式:在被调用的时候创建,单例

          饿汉式:在容器启动的时候创建

多实例:在每次获取的时候创建对象,而且是多例

既然我们之前在car类中创建了销毁方法、初始化方法,那我们如果在bean的生命周期中去调用它的呢?

修改MainConfigOfLifeCycle类中car()方法@Bean的配置

再次运行:

虽然程序结束了,但是bean在程序结束的时候并没有被销毁

 在程序结束之后一定要调用close方法

 运行:

 总结:

销毁:

单实例:容器关闭的时候

多实例:容器不会管理这个bean;容器不会调用销毁方法,需要手动去销毁

 

修改bean的@Scope

修改IOCTest_LifeCycle:

 运行:

我们可以看到它不进行 销毁操作

以上方式使用的是bean里面的参数调用,现在使用另外一种方式

2.类基础上:通过Bean实现InitializingBean(定义初始化逻辑)、DisposableBean(实现销毁逻辑)

创建Cat类继承InitializingBean,DisposableBean

 配置组件注解

在配置文件中直接添加扫描注解

IOCTest_LifeCycle类

运行结果: 

 

 3)可以使用JSR250

第一个注解@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化

 第二个注解@PreDestroy在容器销毁bean之前通知我们进行清理工作

创建Dog类

 添加到容器中:

运行结果:

  

4)BeanPostProcessor:bean的后置处理器;在bean初始化前后进行一些处理工作;

 它的两个方法:

postProcessBeforeInitialization:在初始化之前工作

postProcessAfterInitialization:在初始化之后工作

创建MyBeanPostProcessor类实现BeanPostProcessor接口,实现它的两个方法

 打印传入的参数

 返回bean(也可以返回经过处理的bean)

将后置处理器加入到组件中

 

打印测试:

该后置处理器是对所有自定义注册的bean都进行操作,一定要记住spring自身默认的bean是不经过我们自定义的后置处理器;

而且对于里面的操作是:先执行postProcessAfterInitialization(初始化之前)在执行postConstruct(初始化)最后执行postProcessAfterInitialization(初始化之后)

通过debug发现它的执行流程为:

beanPostProcessor原理

populateBean(beanName,mbd,instanceWrapper);给bean进行属性赋值

poplateBean(beanNae,mbd,instanceWrapper);给bean进行属性赋值

initializeBean

{

applyBeanPostProcessorsBeforeInitializetion();

invokeInitMethods();执行自定义初始化

applyBeanPostProcessorsAfterInitialization()

}

beanPostProcessor底层源码实现

要观察beanPostProcessor的整个实现这周期,直接看它的子类实现(ApplicationContextAware只是它的其中一个实现)

在Dog类中使它继承ApplicationContextAware接口,实现它的setApplicationContext方法

 

查看ApplicationContextAwareProcessor源码,我们可以看到它实现的是beanPostProcessor

查看它的方法

经过一系列判断然后调用invokAwareInteraces()

 

判断bean的类型并设置

 总结:spring底层对Bean的使用:

bean赋值、注入其他组件、@Autowired、生命周期注解功能、@Async等等。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值