spring容器中Bean生命周期

一、前言

1、指定初始化和销毁方法:
通过@Bean指定init-method和destroy-method
2、通过让Bean实现InitializingBean(自定义初始化逻辑),DisposableBean(自定义销毁逻辑)
3、可以使用JSR250:
@PostConstruct:在bean创建完成并且属性赋值完成后来执行初始化方法。
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。
4、BeanPostProcessor【interface】:
bean的后置处理器:在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:初始化之前工作
postProcessAfterInitialization:初始化之后工作

二、代码示例

1、通过@Bean指定init-method和destroy-method
1.1、创建ColorBean 定义初始化和销毁方法

@Slf4j
public class ColorBean {
    ColorBean(){
        log.info("创建ColorBean....");
    }
    public void initMethod(){
        log.info("initMethod----ColorBean....");
    }
    public void destroyMethod(){
        log.info("destroyMethod----ColorBean....");
    }
}

1.2、创建配置列指定初始化和销毁方法

@Configuration
public class ColorConfiguration {
    @Bean(initMethod ="initMethod",destroyMethod = "destroyMethod")
    public ColorBean colorBean(){
    return  new ColorBean();
}
}

1.3、执行测试类验证

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class JuniterTestColor {
    @Test
    public  void testImportBean(){
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(ColorConfiguration.class);
        ColorBean object1=(ColorBean)annotationConfigApplicationContext.getBean("colorBean");
        annotationConfigApplicationContext.close();
    }
}

数据结果:

2020-04-11 16:00:31.764  INFO 108764 : 创建ColorBean....
2020-04-11 16:00:31.768  INFO 108764 : initMethod----ColorBean....
2020-04-11 16:00:31.774  INFO 108764 : destroyMethod----ColorBean....

2、通过让Bean实现InitializingBean(自定义初始化逻辑),DisposableBean(自定义销毁逻辑)
2.1在方法1的基础上

@Slf4j
public class ColorBean implements InitializingBean {
    ColorBean(){
        log.info("创建ColorBean....");
    }
    public void initMethod(){
        log.info("initMethod----ColorBean....");
    }
    public void destroyMethod(){
        log.info("destroyMethod----ColorBean....");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("afterPropertiesSet----ColorBean....");
    }
}

继续执行测试类,输出结果:

2020-04-11 16:06:42.078  INFO 104956 : 创建ColorBean....
2020-04-11 16:06:42.084  INFO 104956 : afterPropertiesSet----ColorBean....
2020-04-11 16:06:42.084  INFO 104956 : initMethod----ColorBean....
2020-04-11 16:06:42.088  INFO 104956 : destroyMethod----ColorBean....

afterPropertiesSet方法会先于@Bean指定的初始化方法。
3、可以使用JSR250:
@PostConstruct:在bean创建完成并且属性赋值完成后来执行初始化方法。
@PreDestroy:在容器销毁bean之前通知我们进行清理工作。

在2基础上继续添加

@Slf4j
public class ColorBean implements InitializingBean {
    ColorBean(){
        log.info("创建ColorBean....");
    }
    public void initMethod(){
        log.info("initMethod----ColorBean....");
    }
    public void destroyMethod(){
        log.info("destroyMethod----ColorBean....");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        log.info("afterPropertiesSet----ColorBean....");
    }
    
    @PostConstruct
    public void postConstructMethod(){
        log.info("postMethod----ColorBean....");
    }
    @PreDestroy
    public void preDestroyMethod(){
        log.info("PreDestroy----ColorBean....");
    }
}

执行测试类,输出测试结果:

2020-04-11 16:16:34.902  INFO 104152: 创建ColorBean....
2020-04-11 16:16:34.907  INFO 104152: postMethod----ColorBean....
2020-04-11 16:16:34.908  INFO 104152: afterPropertiesSet----ColorBean....
2020-04-11 16:16:34.908  INFO 104152: initMethod----ColorBean....
2020-04-11 16:16:34.915  INFO 104152: PreDestroy----ColorBean....
2020-04-11 16:16:34.915  INFO 104152: destroyMethod----ColorBean....

可以查看到各个方法执行顺序。

4、BeanPostProcessor【interface】:bean的后置处理器:在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:初始化之前工作
postProcessAfterInitialization:初始化之后工作

4.1MyBeanPostProcessor .java实现BeanPostProcessor

@Slf4j
public class MyBeanPostProcessor implements BeanPostProcessor {
    public  Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        log.info("postProcessBeforeInitialization----"+beanName+"....");
        return bean;
    }

    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        log.info("postProcessAfterInitialization----"+beanName+"....");
        return bean;
    }
}

4.2MyBeanPostProcessor.java注册到IOC容器

@Configuration
public class ColorConfiguration {
    @Bean(initMethod ="initMethod",destroyMethod = "destroyMethod")
    public ColorBean colorBean(){
    return  new ColorBean();
    }
    @Bean
    public MyBeanPostProcessor myBeanPostProcessor(){
        return  new MyBeanPostProcessor();
    }
}

输出结果为:

2020-04-11 16:30:36.562  INFO 110052: 创建ColorBean....
2020-04-11 16:30:36.565  INFO 110052: postProcessBeforeInitialization----colorBean....
2020-04-11 16:30:36.566  INFO 110052: postMethod----ColorBean....
2020-04-11 16:30:36.566  INFO 110052: afterPropertiesSet----ColorBean....
2020-04-11 16:30:36.566  INFO 110052: initMethod----ColorBean....
2020-04-11 16:30:36.566  INFO 110052: postProcessAfterInitialization----colorBean....
2020-04-11 16:30:36.569  INFO 110052: PreDestroy----ColorBean....
2020-04-11 16:30:36.569  INFO 110052: destroyMethod----ColorBean....

从测试结果可以看出
postProcessBeforeInitialization在初始化之前
postProcessAfterInitialization在初始化之后
了解Bean生命周期可以,让开发者对bean有更深入了解,在bean生命周期节点对bean进行特殊处理。例如数据库连接初始化和容器关闭时。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值