zoukankan      html  css  js  c++  java
  • Spring注解开发之生命周期相关

    生命周期

    initMethod和destroyMethod

    Bean定义

    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 destroy");
        }
    }
    

    配置类

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

    • 可以自定义初始化和销毁方法

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

    • 销毁: 容器关闭进行销毁(单实例)

      多实例容器不会管理这个bean

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

    获取容器

        @Test
        public void test01(){
            printBeans(applicationContext);
    
            // 关闭容器
            applicationContext.close();
        }
    
        private void printBeans(AnnotationConfigApplicationContext applicationContext){
            String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
            for (String beanDefinitionName : beanDefinitionNames) {
                System.out.println(beanDefinitionName);
            }
        }
    

    InitializingBean和DisposableBean

    Bean定义

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

    实现了InitializingBean和Disposable后,也可以实现初始化和销毁的方法

    PostConstruct和PreDestroy

    Bean定义

    public class Dog {
        public Dog(){
            System.out.println("dog constructor");
        }
    
        @PostConstruct
        public void init(){
            System.out.println("dog init");
        }
    
        @PreDestroy
        public void destroy(){
            System.out.println("dog destroy");
        }
    }
    

    BeanPostProcessor

    bean

    定义

    public class MyBeanPostProcessor implements BeanPostProcessor {
    
    
        @Override
        public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("before init" + beanName);
            return bean;
        }
    
        @Override
        public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
            System.out.println("after init" + beanName);
            return bean;
        }
    }
    
    

    加入到bean中,可以发现每个bean初始化前后都会执行功能

    • postProcessBeforeInitialization将在一个bean被完全初始化前进行回调,此时对应的bean已经实例化了,但是对应的属性注入等还没有进行,即在调用InitializingBean的afterPropertiesSet()方法或bean对应的init-method之前
    • postProcessAfterInitialization将在bean被完全初始化后进行回调,此时对应的依赖注入已经完成,即在调用InitializingBean的afterPropertiesSet()方法或对应init-method方法之后。

    postProcessBeforeInitialization方法的返回值会被Spring容器作为处理后的Bean注册到容器中。如果你在postProcessBeforeInitialization方法中重新构造了一个Bean进行返回,而不是返回参数中的bean;那么你返回的Bean将会被注册到Spring容器中。而原来在Spring中配置的Bean(被Spring实例化的Bean)将会被覆盖。

    一旦这两个方法返回null,就不会执行后面的postProcessBefore/AfterInitialization,(在applyBeanPostProcessorsBeforeInitialization中)

            for(Iterator var4 = this.getBeanPostProcessors().iterator(); var4.hasNext(); result = current) {
                BeanPostProcessor processor = (BeanPostProcessor)var4.next();
                current = processor.postProcessBeforeInitialization(result, beanName);
                if (current == null) {
                    return result;
                }
            }
    

    步骤:

    1. populateBean给Bean赋值

    2. initializeBean{ applyBeanPostProcessorsBeforeInitialization,

      ​ invokeInitMethods, // 自定义初始化

      ​ applyBeanPostProcessorsAfterInitialization}

    底层使用

    bean赋值,bean注入,@autowire,生命周期注解功能,@Async

  • 相关阅读:
    STM32 GPIO 配置之ODR, BSRR, BRR 详解
    Understanding the STM32F0's GPIO
    STM32F4 External interrupts
    Calculate CAN bit timing parameters -- STM32
    禁用SQL Server Management Studio的IntelliSense
    SQL Server 2016中In-Memory OLTP继CTP3之后的新改进
    一张图解释SQL Server集群、镜像、复制、日志传送
    SQL Server出现错误: 4014
    SQL Server 2016五大优势挖掘企业用户数据价值
    SQL Server 2008, 2008 R2, 2012 and 2014 完全支持TLS1.2加密传输
  • 原文地址:https://www.cnblogs.com/jimmyhe/p/13661809.html
Copyright © 2011-2022 走看看