最新公告
  • 欢迎您光临极客文库,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • Bean的生命周期

    Spring初始化Bean或者销毁Bean时,有时候需要做一些处理工作,因此Spring可以在创建和拆卸Bean的时候调用Bean的两个生命周期方法。

    这两个方法可以随便取名字,然后在我们配置的时候将其配置上就行了。可以用init-method属性来指定Bean被初始化的时候会调用的一个方法的名称,这里的init是可以任意指定的。

    然后在销毁的时候会调用一个方法名”destroy”,destroy方法调用是有条件的,单例模式的时候才能调用销毁方法,因为多例的时候Spring不知道销毁哪一个。

    [v_notice]Web容器中会自动调用,但是main函数或测试用例需要手动调用。[/v_notice]

    Bean的生命周期的完整过程

    如图是Bean生命周期的完整过程

    演示过程:

    1、instantiate bean对象实例化

    2、populate properties封装属性

    3、如果Bean实现BeanNameAware执行setBeanName

    4、如果Bean实现BeanFactoryAware或者ApplicationContextAware设置工程setBeanFactory或者上下文对象setApplicationContext

    5、如果存在类实现BeanPostProcessor(后处理Bean),执行postProcessBeforeInitialization

    6、如果Bean实现InitializingBean执行afterPropertiesSet

    7、调用指定初始化方法init

    8、如果存在类实现BeanPostProcessor(处理Bean),执行postProcessAfterInitialization

    9、执行业务处理

    10、如果Bean实现DisposableBean执行destroy

    11、调用指定销毁方法customerDestroy

    代码演示

    根据以上分析,完成代码

    demo3下新建一个Man.java

    package com.jikewenku.ioc.demo3;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.BeanNameAware;
    import org.springframework.beans.factory.DisposableBean;
    import org.springframework.beans.factory.InitializingBean;
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.ApplicationContextAware;
    
    public class Man implements BeanNameAware,ApplicationContextAware,InitializingBean,DisposableBean{
        private String name;
    
        public void setName(String name) {
            System.out.println("第二步:设置属性");
            this.name = name;
        }
    
        public Man(){
            System.out.println("第一步:初始化...");
        }
        public void setup(){
            System.out.println("第七步:MAN被初始化了...");
        }
    
        public void teardown(){
            System.out.println("第十一步:MAN被销毁了...");
        }
    
        @Override
        public void setBeanName(String name) {
            System.out.println("第三步:设置Bean的名称"+name);
        }
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
            System.out.println("第四步:了解工厂信息");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("第六步:属性设置后");
        }
    
        public void run(){
            System.out.println("第九步:执行业务方法");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("第十步:执行Spring的销毁方法");
        }
    }
    
    

    同时编写配置文件

    
        
    
    

    新建一个类MyBeanPostProcessor

    package com.jikewenku.ioc.demo3;
    
    import org.springframework.beans.BeansException;
    import org.springframework.beans.factory.config.BeanPostProcessor;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    public class MyBeanPostProcessor implements BeanPostProcessor {
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            //System.out.println("第五步:初始化前方法...");
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(final Object bean, String beanName) throws BeansException {
           · System.out.println("第八步:初始化后方法...");
             return bean;
    }
    

    再去配置文件中配置一个bean标签,但是这个标签比较特殊,不需要配置id,因为配置id是为了在工厂当中或者其他地方能用到这个bean,而这个类,在Spring帮我们生成实例的过程中会自动调用,不需要其他地方去引用,所以不需要配置id.

    
    

    在SpringDemo3中创建测试方法

    @Test
    public void demo2(){
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Man man = (Man)applicationContext.getBean("man");
    
        man.run();
    
        applicationContext.close();
    }
    

    运行程序,看一下完整的生命周期,关键部分是其中的第五步和第八步。

    本站所有文章均由网友分享,仅用于参考学习用,请勿直接转载,如有侵权,请联系网站客服删除相关文章。若由于商用引起版权纠纷,一切责任均由使用者承担
    极客文库 » Spring Bean管理(XML方式)之Bean的生命周期的完整过程

    常见问题FAQ

    如果资源链接失效了怎么办?
    本站用户分享的所有资源都有自动备份机制,如果资源链接失效,请联系本站客服QQ:2580505920更新资源地址。
    如果用户分享的资源与描述不符怎么办?
    可以联系客服QQ:2580505920,如果要求合理可以安排退款或者退赞助积分。
    如何分享个人资源获取赞助积分或其他奖励?
    本站用户可以分享自己的资源,但是必须保证资源没有侵权行为。点击个人中心,根据操作填写并上传即可。资源所获收益完全归属上传者,每周可申请提现一次。
    如果您发现了本资源有侵权行为怎么办?
    及时联系客服QQ:2580505920,核实予以删除。

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者

    Leave a Reply

    Hi, 如果你对这款资源有疑问,可以跟我联系哦!

    联系发布者
    • 102会员总数(位)
    • 3674资源总数(个)
    • 2本周发布(个)
    • 0 今日发布(个)
    • 136稳定运行(天)

    欢迎加入「极客文库」,成为原创作者从这里开始!

    立即加入 了解更多
    成为赞助用户享有更多特权立即升级