码迷,mamicode.com
首页 > 编程语言 > 详细

spring之bean的生命周期

时间:2019-09-10 20:56:25      阅读:230      评论:0      收藏:0      [点我收藏+]

标签:ble   管理   执行   过程   res   @param   sse   eth   创建   

生命周期的过程:

spring容器管理bean的生命周期

bean的创建——初始化——销毁

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

1)指定初始化和销毁方法

bean的实体类:

public class Blue {
    public Blue(){
        System.out.println("执行了构造方法...");
    }
    public void init(){
        System.out.println("执行了初始化方法...");
    }
    public void destroy(){
        System.out.println("执行了销毁方法");
    }
}

MainConfig配置类:

@Bean(initMethod = "init",destroyMethod = "destroy")
public Blue blue(){
    return new Blue();
}

测试类:

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器创建完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("blue");
        applicationContext.close();
    }
}

测试结果:

九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:05:37 CST 2019]; root of context hierarchy
执行了构造方法...
执行了初始化方法...
容器创建完成了...

九月 10, 2019 5:05:37 下午 org.springframework.context.support.AbstractApplicationContext doClose
执行了销毁方法

结论:我们可以看到指定的初始化方法是在bean对象创建完成后调用,销毁方法是在容器关闭的时候调用的。

? 值得一提的是如果bean对象是多实例的时候,spring不会调用其销毁方法,对象的销毁由JVM进行回收。

2)InitializingBean和DisposableBean

作用:我们可以通过让Bean实现InitializingBean(定义初始化逻辑)和DisposableBean(定义销毁逻辑)

Cat实体类

@Component
public class Cat implements InitializingBean,DisposableBean {
    public Cat(){
        System.out.println("执行了构造方法...");
    }
    public void destroy() throws Exception {
        System.out.println("destroy...");
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("afterPropertiesSet...");
    }
}

测试类

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器创建完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("cat");
        applicationContext.close();
    }
}

测试结果

信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
执行了构造方法...
afterPropertiesSet...
容器创建完成了...
九月 10, 2019 5:26:30 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 17:26:30 CST 2019]; root of context hierarchy
destroy...

3)JSR250

作用:在这里你可以使用@PostConstruct注解作为初始化回调的替代和@PreDestroy注解作为销毁回调的替代

Bean实体类

@Component
public class Blue {
    public Blue(){
        System.out.println("构造方法执行了...");
    }
    //对象创建并赋值之后调用
    @PostConstruct
    public void init(){
        System.out.println("init...执行了");
    }
    //移除Bean之后调用
    @PreDestroy
    public void destroy(){
        System.out.println("destroy...执行了");
    }
}

测试类

public class IocTest {
    private AnnotationConfigApplicationContext applicationContext;

    @Before
    public void init(){
        applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("容器创建完成了...");
    }
    @Test
    public void testLifeCycle(){
        applicationContext.getBean("blue");
        applicationContext.close();
    }
}

测试结果

九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
构造方法执行了...
init...执行了
九月 10, 2019 7:41:06 下午 org.springframework.context.support.AbstractApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6f79caec: startup date [Tue Sep 10 19:41:06 CST 2019]; root of context hierarchy
容器创建完成了...
destroy...执行了

4)BeanPostProcessor后置处理器

作用:可以自定义BeanPostProcessor的实现类来对bean对象初始化前后进行操作

@Component
public class MyBeanPostProcessor implements BeanPostProcessor{
    /**
     *
     * @param bean 将要创建的实例对象
     * @param beanName 实例对象在容器中的名字
     * @return 我们可以将要创建的bean对象进行包装之后返回
     * @throws BeansException
     */
    //bean对象初始化方法执行前执行
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessBeforeInitialization...执行了");
        return bean;
    }
    //bean对象初始化方法执行后执行
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("postProcessAfterInitialization...执行了");
        return bean;
    }
}

spring之bean的生命周期

标签:ble   管理   执行   过程   res   @param   sse   eth   创建   

原文地址:https://www.cnblogs.com/lee0527/p/11502660.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!