• spring(二):bean的生命周期


    bean的生命周期指的是bean的创建——>初始化——>销毁的过程,该过程是由spring容器进行管理的

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

    自定义初始化和销毁方法

    init-method、destroy-method

    配置文件的bean标签中配置init-method、destroy-method属性

    <bean id="user" class="com.enjoy.study.pojo.User" init-method="init" destroy-method="destroy"/>

    bean类
    public class User {
        public User() {
            System.out.println("user....constructor..........");
        }
    
        public void init(){
            System.out.println("user....init..........");
        }
    
        public void destroy(){
            System.out.println("user....destroy..........");
        }
    }

    测试类
    public class Cap7Test {
        @Test
        public void cap7Test(){
            ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:beans.xml");
            System.out.println("ioc容器启动完成");
            context.close();
        }
    }

    结果
    user....constructor..........
    user....init..........
    
    ioc容器启动完成
    user....destroy..........

    initMethod、destroyMethod

    @Bean配置initMethod、destroyMethod属性

    单实例情况:

    @Configuration
    public class Cap7MainConfig {
        @Bean(initMethod = "init",destroyMethod = "destroy")
        public User user(){
            return new User();
        }
    }

    测试方法
    @Test
    public void annoTest(){
    	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap7MainConfig.class);
    	System.out.println("ioc容器启动完成");
    	context.close();
    }

    结果
    user....constructor..........
    user....init..........
    
    ioc容器启动完成
    user....destroy..........
    

    多实例情况:

    @Configuration
    public class Cap7MainConfig {
        @Scope("prototype")
        @Bean(initMethod = "init",destroyMethod = "destroy")
        public User user(){
            return new User();
        }
    }

    结果
    ioc容器启动完成  

    单实例情况下,容器启动时完成bean的实例化,容器关闭时进行bean的销毁

    多实例情况下,容器启动时不进行bean的实例化,获取bean时实例化bean对象,所以启动后直接关闭容器,容器中并未进行bean的管理

    InitializingBean、DisposableBean接口

    bean实现InitializingBean接口,实现afterPropertiesSet()方法:beanFactory创建对象完成,并且设置完属性后,调用该方法,相当于初始化方法

    bean实现DisposableBean接口,实现destroy()方法:bean对象销毁时,调用该方法

    public class User implements InitializingBean,DisposableBean {
        public User() {
            System.out.println("user....constructor..........");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("user....afterPropertiesSet.........");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("user....destroy............");
        }
    }

    配置类
    @Configuration
    public class Cap7MainConfig {
        @Bean
        public User user(){
            return new User();
        }
    }

    结果
    user....constructor..........
    user....afterPropertiesSet.........
    ioc容器启动完成
    user....destroy............
    

    @PostConstruct、@PreDestroy

    @Component
    public class User{
        public User() {
            System.out.println("user....constructor..........");
        }
    
        //对象创建并赋值后使用
        @PostConstruct
        public void init() {
            System.out.println("user....init.........");
        }
    
        //容器移除对象之前回调通知,销毁bean
        @PreDestroy
        public void destroy() {
            System.out.println("user....destroy............");
        }
    }

    配置类
    @Configuration
    @ComponentScan("com.enjoy.study.cap7")
    public class Cap7MainConfig {
    }

    结果
    user....constructor..........
    user....init.........
    
    ioc容器启动完成
    user....destroy............
    

    BeanPostProcessor

    后置处理器,负责在初始化前后做相应处理

    /**
     * 后置处理器
     * @Component,将后置处理器加入容器中
     * @author qf
     * @create 2019-05-22 10:05
     */
    @Component
    public class MyBeanPostProcessor implements BeanPostProcessor {
    
        /**
         * 在初始化之前进行相应后置处理工作。比如在init-method方法执行之前,或者initializingBean的afterPropertiesSet方法之前
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessBeforeInitialization......"+bean+"........."+beanName);
            return bean;
        }
    
        /**
         * 在初始化之后进行相应后置处理工作
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessAfterInitialization......"+bean+"........."+beanName);
            return bean;
        }
    }
    

    测试

    @Component
    public class User implements InitializingBean,DisposableBean {
    
        @Override
        public void destroy() throws Exception {
            System.out.println("user....destroy........");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("user....afterPropertiesSet........");
        }
    }

    配置类
    @Configuration
    @ComponentScan("com.enjoy.study.cap8")
    public class Cap8MainConfig {
    }

    测试类
    public class Cap8Test {
        @Test
        public void cap8Test(){
            AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Cap8MainConfig.class);
            System.out.println("ioc容器创建完成");
            context.close();
        }
    }

    结果
    postProcessBeforeInitialization...............org.springframework.context.event.internalEventListenerProcessor
    postProcessAfterInitialization...............org.springframework.context.event.internalEventListenerProcessor
    postProcessBeforeInitialization...............org.springframework.context.event.internalEventListenerFactory
    postProcessAfterInitialization...............org.springframework.context.event.internalEventListenerFactory
    postProcessBeforeInitialization...............cap8MainConfig
    postProcessAfterInitialization...............cap8MainConfig
    postProcessBeforeInitialization...............user
    user....afterPropertiesSet........
    postProcessAfterInitialization...............user
    
    ioc容器创建完成
    
    user....destroy........
    

      

  • 相关阅读:
    Python查找最新测试报告到邮件功能
    windows下如何安装pip以及如何查看pip是否已经安装成功
    selenium之 chromedriver与chrome版本映射表(更新至v2.33)
    selenium 获取input输入框中的值的方法
    iframe 内联框架
    frameset导航框架
    html 7.28
    存储器
    递增输出带表头结点的单链表元素
    从头到尾反向输出带头结点的单链表的每个节点的值
  • 原文地址:https://www.cnblogs.com/qf123/p/10901308.html
Copyright © 2020-2023  润新知