亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring注解開發(fā)生命周期原理解析

 更新時間:2020年09月14日 09:17:38   作者:Jimmyhe  
這篇文章主要介紹了Spring注解開發(fā)生命周期原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

生命周期

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創(chuàng)建--初始化--銷毀
  • 可以自定義初始化和銷毀方法
  • 初始化:對象創(chuàng)建完成,并賦值完成,調(diào)用初始化方法
  • 銷毀: 容器關(guān)閉進(jìn)行銷毀(單實例)

​ 多實例容器不會管理這個bean

@Configuration
public class MyCOnfigOfLifeCycle {

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

獲取容器

  @Test
  public void test01(){
    printBeans(applicationContext);

    // 關(guān)閉容器
    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");
  }
}

實現(xiàn)了InitializingBean和Disposable后,也可以實現(xiàn)初始化和銷毀的方法

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中,可以發(fā)現(xiàn)每個bean初始化前后都會執(zhí)行功能

  • postProcessBeforeInitialization將在一個bean被完全初始化前進(jìn)行回調(diào),此時對應(yīng)的bean已經(jīng)實例化了,但是對應(yīng)的屬性注入等還沒有進(jìn)行,即在調(diào)用InitializingBean的afterPropertiesSet()方法或bean對應(yīng)的init-method之前
  • postProcessAfterInitialization將在bean被完全初始化后進(jìn)行回調(diào),此時對應(yīng)的依賴注入已經(jīng)完成,即在調(diào)用InitializingBean的afterPropertiesSet()方法或?qū)?yīng)init-method方法之后。

postProcessBeforeInitialization方法的返回值會被Spring容器作為處理后的Bean注冊到容器中。如果你在postProcessBeforeInitialization方法中重新構(gòu)造了一個Bean進(jìn)行返回,而不是返回參數(shù)中的bean;那么你返回的Bean將會被注冊到Spring容器中。而原來在Spring中配置的Bean(被Spring實例化的Bean)將會被覆蓋。

一旦這兩個方法返回null,就不會執(zhí)行后面的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;
      }
    }

步驟:

populateBean給Bean賦值

initializeBean{ applyBeanPostProcessorsBeforeInitialization,

​ invokeInitMethods, // 自定義初始化

​ applyBeanPostProcessorsAfterInitialization}

底層使用

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論