zoukankan      html  css  js  c++  java
  • Bean的生命周期

    Bean的生命周期

    bean创建-->初始化-->销毁

    容器管理Bean的生命周期

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

    • 创建(对象创建)

      单实例:在容器启动的时候创建

      多实例:在每次获取的时候创建

    • 初始化

      对象创建完成,并赋值好,调用初始化方法

    • 销毁

      单实例bean在容器关闭的时候销毁

      多实例bean容器不会调用销毁,这时候可以手动来调用销毁方法

    1. 指定初始化和销毁方法:

    通过@Bean注解指定init-method和destory-method
    

    要被注入的bean类Car

    @Component
    public class Car {
        public Car(){
            System.out.println("car constructor---");
        }
        //初始化里可以进行一系列操作,如属性赋值
        public void init(){
            System.out.println("car init---");
        }
        //销毁里可以进行比如连接数据源的关闭等等
        public void destroy(){
            System.out.println("car destory---");
        }
    }
    

    配置类:指定了初始化方法initMethod = "init"和销毁方法destroyMethod = "destroy"

    @Configuration
    public class BeanConfigOfLifeCycle {
    
        @Bean(initMethod = "init", destroyMethod = "destroy")
        public Car car(){
            return new Car();
        }
    }
    

    测试方法

    public class IOCTestLifeCycle {
    
        @Test
        public void test01() {
            //1、ioc容器的创建
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfigOfLifeCycle.class);
            System.out.println("容器创建完成---");
            //关闭容器
            applicationContext.close();
        }
    }
    

    运行结果

    car constructor---
    car init---
    容器创建完成---
    car destory---
    

    2. 通过实现接口的方式

    让Bean实现Spring提供的InitializingBean(定义初始化逻辑)接口和 DisposableBean(定义销毁逻辑)接口

    @Component
    public class Cat implements InitializingBean, DisposableBean {
    
        public Cat(){
            System.out.println("car constructor---");
        }
    
        @Override
        public void destroy() throws Exception {
            System.out.println("cat destory---");
        }
    
        @Override
        public void afterPropertiesSet() throws Exception {
            System.out.println("cat afterPropertiesSet---");
        }
    }
    
    

    3. 使用JSR250

    @PostConstruct:在bean创建完成并且属性赋值完成之后来执行初始化方法

    @PreDestroy:在容器销毁bean之前通知我们进行清理工作

    @Component
    public class Dog implements ApplicationContextAware {
    
        public Dog(){
            System.out.println("dog constructor---");
        }
    
        /**
         * 对象创建并赋值之后调用
         */
        @PostConstruct
        public void init(){
            System.out.println("dog postConstructor---");
        }
    
        /**
         * 在容器移除对象之前调用
         */
        @PreDestroy
        public void preDestroy(){
            System.out.println("dog preDestroy---");
        }
    
    }
    

    4. 使用Bean的后置处理器

    BeanPostProcessor接口:bean的后置处理器,在bean初始化前后进行一些处理工作
    postProcessBeforeInitialization:在初始化之前工作
    postProcessAfterInitialization:在初始化之后工作

    自定义的BeanPostProcessor还可以实现Ordered接口进行自定义排序

    public class MyBeanPostProcessor implements BeanPostProcessor, Ordered {
    
        /**
         * 在所有其他初始化操作(Bean指定、实现、JSR250)之前执行处理
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessBeforeInitialization---"+beanName+"---");
            return bean;
        }
    
        /**
         * 在所有初始化之后操作之后执行处理
         * @param bean
         * @param beanName
         * @return
         * @throws BeansException
         */
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("postProcessAfterInitialization---"+beanName+"---");
            return bean;
        }
    
        @Override
        public int getOrder() {
            return 0;
        }
    }
    

    配置类:@Import注入MyBeanPostProcessor

    @Configuration
    @Import(MyBeanPostProcessor.class)
    public class BeanConfigOfLifeCycle {
    
        @Bean(initMethod = "init", destroyMethod = "destroy")
        public Car car(){
            return new Car();
        }
    }
    

    测试方法:

    public class IOCTestLifeCycle {
    
        @Test
        public void test01() {
            //1、ioc容器的创建
            AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeanConfigOfLifeCycle.class);
            System.out.println("容器创建完成---");
            //关闭容器
            applicationContext.close();
        }
    }
    

    运行结果

    car constructor---
    postProcessBeforeInitialization---car---
    car init---
    postProcessAfterInitialization---car---
    容器创建完成---
    car destory---
    
  • 相关阅读:
    【LeetCode】119. Pascal's Triangle II
    随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比[转]
    linux下一些可用库
    malloc分配的内存空间是连续的吗
    语言模型训练网站
    relocation 错误
    undefined reference to `dlopen'
    静态库之间有依赖关系顺序很重要
    C++引用详解
    malloc原理和内存碎片[转]
  • 原文地址:https://www.cnblogs.com/cathyqq/p/14407796.html
Copyright © 2011-2022 走看看