Spring Bean 生命周期测试
Bean的生命周期是开始创建到销毁的过程。需要实现相关的类BeanNameAware ,DisposableBean, InitializingBean ,并注册InstantiationAwareBeanPostProcessor。
Bean类实现BeanNameAware ,DisposableBean, InitializingBean 接口
- package com.bean.life.entity;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.factory.*;
- import org.springframework.stereotype.Component;
- @Component
- public class User implements BeanFactoryAware
- , BeanNameAware
- , InitializingBean
- , DisposableBean
- {
- @Override
- public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
- System.out.println("BeanFactoryAware setBeanFactory");
- }
- @Override
- public void setBeanName(String s) {
- System.out.println("BeanNameAware接口: setBeanName = " + s);
- }
- @Override
- public void afterPropertiesSet() throws Exception {
- System.out.println("InitializingBean接口: afterPropertiesSet");
- }
- @Override
- public void destroy() throws Exception {
- System.out.println("DisposableBean接口: destroy");
- }
- @PostConstruct
- public void init(){
- System.out.println("PostConstruct");
- }
- @PreDestroy
- public void destory(){
- System.out.println("PreDestroy");
- }
- }
注册InstantiationAwareBeanPostProcessor接口。
这里的InstantiationAwareBeanPostProcessorAdapter是 InstantiationAwareBeanPostProcessor 的子孙类。
- package com.bean.life.entity;
- import org.springframework.beans.BeansException;
- import org.springframework.beans.PropertyValues;
- import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;
- import org.springframework.stereotype.Component;
- import java.beans.PropertyDescriptor;
- import java.lang.reflect.Constructor;
- @Component
- public class MyInstantiationAwareBeanPostProcessor extends
- InstantiationAwareBeanPostProcessorAdapter {
- public MyInstantiationAwareBeanPostProcessor() {
- super();
- }
- @Override
- public Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: " + beanName);
- }
- return super.determineCandidateConstructors(beanClass, beanName);
- }
- @Override
- public Object getEarlyBeanReference(Object bean, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: getEarlyBeanReference: " + beanName);
- }
- return super.getEarlyBeanReference(bean, beanName);
- }
- @Override
- public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: " + beanName);
- }
- return super.postProcessBeforeInstantiation(beanClass, beanName);
- }
- @Override
- public boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : " + beanName);
- }
- return super.postProcessAfterInstantiation(bean, beanName);
- }
- @Override
- public PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessPropertyValues: " + beanName);
- }
- return super.postProcessPropertyValues(pvs, pds, bean, beanName);
- }
- @Override
- public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: " + beanName);
- }
- return super.postProcessBeforeInitialization(bean, beanName);
- }
- @Override
- public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
- if(beanName.equals("user")){
- System.out.println("MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInitialization: " + beanName);
- }
- return super.postProcessAfterInitialization(bean, beanName);
- }
- }
输出
- MyBeanFactoryPostProcessor --- BeanFactoryPostProcessor
- MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInstantiation: user
- MyInstantiationAwareBeanPostProcessor接口: determineCandidateConstructors: user
- MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInstantiation : user
- MyInstantiationAwareBeanPostProcessor接口: postProcessPropertyValues: user
- BeanNameAware接口: setBeanName = user
- BeanFactoryAware setBeanFactory
- MyInstantiationAwareBeanPostProcessor接口: postProcessBeforeInitialization: user
- PostConstruct
- InitializingBean接口: afterPropertiesSet
- MyInstantiationAwareBeanPostProcessor接口: postProcessAfterInitialization: user
- PreDestroy
- DisposableBean接口: destroy
生命周期图解
Spring 实现按 init-method 和destory-method的三种方式
- 方式1:xml配置方式
- package com.bean.life.entity;
- public class User
- {
- public void init(){
- System.out.println("PostConstruct");
- }
- public void destory(){
- System.out.println("PreDestroy");
- }
- }
- <bean id="user" class="com.bean.life.entity" init-method="init" destroy-method="destroy">
- </bean>
- 方式2:注解配置
添加@PostConstruct 和@PreDestroy进行指定
- package com.bean.life.entity;
- @Component
- public class User
- {
- @PostConstruct
- public void init(){
- System.out.println("PostConstruct");
- }
- @PreDestroy
- public void destory(){
- System.out.println("PreDestroy");
- }
- }
- 方式3: 使用注解@Bean
- public @interface Bean {
- @AliasFor("name")
- String[] value() default {};
- @AliasFor("value")
- String[] name() default {};
- Autowire autowire() default Autowire.NO;
- String initMethod() default "";
- String destroyMethod() default "(inferred)";
- }
- @Configuration
- public class UserConfig{
- @Bean(initMethod="init",destoryMethod="destory")
- public User user(){
- return new User();
- }
- }
Spring Bean 生命周期测试的更多相关文章
- Spring点滴四:Spring Bean生命周期
Spring Bean 生命周期示意图: 了解Spring的生命周期非常重要,我们可以利用Spring机制来定制Bean的实例化过程. -------------------------------- ...
- 大厂高频面试题Spring Bean生命周期最详解
Spring作为当前Java最流行.最强大的轻量级框架.Spring Bean的生命周期也是面试高频题,了解Spring Bean周期也能更好地帮助我们解决日常开发中的问题.程序员应该都知道Sprin ...
- Spring Bean生命周期,好像人的一生。。
大家好,我是老三,上节我们手撸了一个简单的IOC容器五分钟,手撸一个Spring容器!,这节我们来看一看Spring中Bean的生命周期,我发现,和人的一生真的很像. 简单说说IoC和Bean IoC ...
- spring bean 生命周期和 ? 作用域? spirng bean 相互依赖? jvm oom ? jvm 监控工具? ThreadLocal 原理
1. spring bean 生命周期 1. 实例化一个bean ,即new 2. 初始化bean 的属性 3. 如果实现接口 BeanNameAware ,调用 setBeanName 4. Bea ...
- Spring Bean 生命周期之destroy——终极信仰
上一篇文章 Spring Bean 生命周期之我从哪里来 说明了我是谁? 和 我从哪里来? 的两大哲学问题,今天我们要讨论一下终极哲学我要到哪里去? 初始化 Spring Bean 有三种方式: @P ...
- 常见问题:Web/Servlet生命周期与Spring Bean生命周期
Servlet生命周期 init()初始化阶段 Servlet容器加载Servlet(web.xml中有load-on-startup=1;Servlet容器启动后用户首次向Servlet发请求;Se ...
- 睡前聊一聊"spring bean 生命周期"
spring bean 生命周期=实属初销+2个常见接口+3个Aware型接口+2个生命周期接口 实属初销:spring bean生命周期只有四个阶段,即实例化->属性赋值->初始化-&g ...
- Spring Bean 生命周期2
在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Sin ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
随机推荐
- 关于Linux虚拟化技术KVM的科普
虚拟化技术应用越来越广泛,虚拟化技术需求越来越强劲.KVM.XEN.Docker等比较热门,尤其是KVM技术越来越受欢迎. 基于此背景,了解一下KVM+QEMU就有点必要了. 从网上收集了一些资料进行 ...
- monkey操作
1.monkey命令格式 直接adb shell进入后输入monkey [options] <eventcount> 或者每次输入adb shell monkey [options] &l ...
- 使用java检测网络连接状况
windows中可以通过在cmd中使用ping命令来检测网络连接状况,如下: 网络连接正常时: 网络未连接时: 在java中可以通过调用ping命令来判断网络是否连接正常: package modul ...
- Android UI性能优化实战 识别绘制中的性能问题
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45556391: 本文出自:[张鸿洋的博客] 1.概述 2015年初google ...
- css3绘制三角形
将div的宽和高设置为0:利用border-width.border-style.border-color属性绘制不同位置边框的样式.将不需要展示的三角颜色填充为transparent透明即可,就能得 ...
- 爬虫之scrapy-splash
什么是splash Splash是一个Javascript渲染服务.它是一个实现了HTTP API的轻量级浏览器,Splash是用Python实现的,同时使用Twisted和QT.Twisted(QT ...
- MySQL 8 新特性之降序索引
MySQL 8.0终于支持降序索引了.其实,从语法上,MySQL 4就支持了,但正如官方文档所言,"they are parsed but ignored",实际创建的还是升序索引 ...
- IZT复杂电磁环境记录回放和模拟系统
结合实验室复杂电磁环境特性与模拟研究需求,实现对复杂多变的电磁环境录制.分析.重构和模拟,记录回放系统应具备如下几项能力: 1.电磁环境信号记录能力:能够实现对9KHz-18GHz频带范围内射频信号的 ...
- conn.go 源码阅读
), Conn: conn, } return k, v } // 返回远程节点地址 func (self *Connect) Addr() string { ...
- dirlock_windows.go
package dirlock type DirLock struct { dir string } func New(dir string) *DirLock { return &a ...