Spring注解驱动开发 第七节 bean的生命周期

Spring注解驱动开发 第七节 bean的生命周期

Bean的声明周期:
bean的创建 ==> 初始化 ==> 销毁
这个生命周期是spring容器来管理的,现在我们要自己管理bean的声明周期。容器执行到当前的声明周期的时候调用我们自定义的方法。所以我们要指定初始化和销毁方法。

public class Blue {

    public Blue(){
        System.out.println("Blue被加载到spring容器中了...");
    }

    public void init(){
        System.out.println("Blue init方法启动了...");
    }

    public void destory(){
        System.out.println("Blue xiaohui方法启动了...");
    }
}

在Blue类中写入默认构造器,初始化方法和销毁方法。

@Configuration
public class MainConfig4 {
//    @Bean
//    public MyBeanFactory beanFactory(){
//        return new MyBeanFactory();
//    }
    @Bean(initMethod = "init",destroyMethod = "destory")
    public Blue blue(){
        return new Blue();
    }

}

然后我们在配置类中将Blue类注入到spring容器,在@Bean注解中有一个initMethod和destoryMethod属性,这两个属性控制着Blue类在注入容器后初始化调用我们上面定义的方法,销毁调用我们上面定义的销毁方法。 查看打印结果:

四月 23, 2019 2:03:19 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:03:19 GMT+08:00 2019]; root of context hierarchy
Blue被加载到spring容器中了...
Blue init...

四月 23, 2019 2:03:19 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:03:19 GMT+08:00 2019]; root of context hierarchy
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig4
blue
Blue destory...

Process finished with exit code 0

可以看出由于是单实例,所以在启动的时候spring容器就调用Blue构造器并注入到spring容器中,然后才执行了我们自定义的初始化方法。最后执行了我们自定义的销毁方法。如果是多实例的话会怎样。

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

我们将Blue改为多实例,查看打印结果。

四月 23, 2019 2:09:36 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:09:36 GMT+08:00 2019]; root of context hierarchy
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig4
blue
四月 23, 2019 2:09:36 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:09:36 GMT+08:00 2019]; root of context hierarchy

Process finished with exit code 0

可以看到,你不会获得任何结果,因为我们之前说过,多实例需要在获取bean的时候才会加载,所以我们获取一下bean。

四月 23, 2019 2:11:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:11:52 GMT+08:00 2019]; root of context hierarchy
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalRequiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
mainConfig4
blue
Blue被加载到spring容器中了...
Blue init...
四月 23, 2019 2:11:52 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext doClose
信息: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@2f410acf: startup date [Tue Apr 23 14:11:52 GMT+08:00 2019]; root of context hierarchy

Process finished with exit code 0

可以看到Blue被加载了,初始化方法被调用起来了,但是没有销毁方法没有调用,因为时多实例,所以没有把对象交给spring处理,所以spring容器是不管多实例bean的销毁的,所以不能调用销毁方法。
总结:我们可以自定义bean初始化以及销毁时的额外逻辑,但是在多实例情况下,spring不会调用销毁方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值