zoukankan      html  css  js  c++  java
  • Spring之bean生命始末

    可以为Bean定制初始化后的生命行为,也可以为Bean定制销毁前的生命行为。
    举例:ba06包。
    首先,这些方法需要在Bean类中事先定义好:是方法名随意的public void方法。

    其次,在配置文件的<bean/>标签中增加如下属性:
    init-method:指定初始化方法的方法名
    destroy-method:指定销毁方法的方法名

    注意,若要看到Bean的destroy-method的执行结果,需要满足两个条件:
    (1)Bean为singleton,即单例
    (2)要确保容器关闭。接口ApplicationContext没有close()方法,但其实现类有。所以,可以将ApplicationContext强转为其实现类对象,或直接创建的就是实现类对象。

    Bean的生命周期
    Bean实例从创建到最后销毁,需要经过很多过程,执行很多生命周期方法。
    Step1:调用无参构造器,创建实例对象。
    Step2:调用参数的setter,为属性注入值。

    Step3:若Bean实现了BeanNameAware接口,则会执行接口方法setBeanName(String beanId),使Bean类可以获取其在容器中的id名称。
    Step4:若Bean实现了BeanFactoryAware接口,则执行接口方法setBeanFactory(BeanFactory factory),使Bean类可以获取到BeanFactory对象。
    Step5:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessBeforeInitialization()。
    Step6:若Bean实现了InitializingBean 接口,则执行接口方法afterPropertiesSet ()。该方法在Bean的所有属性的set方法执行完毕后执行,是Bean初始化结束的标志,即Bean实例化结束。
    Step7:若设置了init-method方法,则执行。
    Step8:若定义并注册了Bean后处理器BeanPostProcessor,则执行接口方法postProcessAfterInitialization()。
    Step9:执行业务方法。
    Step10:若Bean实现了DisposableBean接口,则执行接口方法destroy()。
    Step11:若设置了destroy-method方法,则执行。

    <bean/>标签的id属性与name属性
    一般情况下,命名<bean/>使用id属性,而不使用name属性。在没有id属性的情况下,name属性与id属性作用是相同的。但,当<bean/>中含有一些特殊字符时,就需要使用name属性了。
    id的命名需要满足XML对ID属性命名规范:必须以字母开头,可以包含字母、数字、下划线、连字符、句话、冒号。且要求名称在容器中必须唯一。
    name则可以包含各种字符,且对名称没有唯一性要求。若名称不唯一,则后面的会覆盖前面的。

    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.*;
    
    public class ISomeServiceImpl  implements ISomeService,BeanNameAware,BeanFactoryAware,InitializingBean,DisposableBean{
    
        private String adao;
    
        public void setAdao(String adao) {
            this.adao = adao;
            System.out.println("step2:setter方法");
        }
    
        ISomeServiceImpl(){
            System.out.println("step1:构造方法");
        }
    
        @Override
        public String doFirst() {
            System.out.println("step9:主方法体doFirst()=============");
            return "abcde";
        }
    
        @Override
        public void doSecond() {
    //        System.out.println("=============doSecond()=============");
        }
    
        public void initAfter(){
            System.out.println("step7:initAfter()初始化之后=============");
        }
    
        public void preDestroy(){
            System.out.println("step11:preDestroy()销毁之前=============");
        }
    
        @Override
        public void setBeanName(String s) {
            System.out.println("step3:beanName=" +s );
        }
    
        @Override
        public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
            System.out.println("step4:beanFactory"+beanFactory);
        }
    
    //    方法标识着bean的初始化工作已经完毕
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("step6:bean的初始化工作已经完毕");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("step10:准备开始执行销毁流程");
        }
    }
  • 相关阅读:
    Java回调机制
    显示Title和隐藏Title的ListView
    ListView的小知识
    小知识点
    Shader的使用
    项目知识(二)
    项目知识(一)
    复习篇(一)Activity的生命周期和启动模式
    BootStrap 提示框
    BootStrap选项卡
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/9014224.html
Copyright © 2011-2022 走看看