最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring中Bean的生命周期使用解析

 更新時間:2019年09月03日 09:44:33   作者:技術(shù)-劉騰飛  
這篇文章主要介紹了Spring中Bean的生命周期使用解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Bean的生命周期

解釋

(1)BeanFactoryPostProcessor的postProcessorBeanFactory()方法:若某個IoC容器內(nèi)添加了實現(xiàn)了BeanFactoryPostProcessor接口的實現(xiàn)類Bean,那么在該容器中實例化任何其他Bean之前可以回調(diào)該Bean中的postPrcessorBeanFactory()方法來對Bean的配置元數(shù)據(jù)進行更改,比如從XML配置文件中獲取到的配置信息。

(2)Bean的實例化:Bean的實例化是使用反射實現(xiàn)的。

(3)Bean屬性注入:Bean實例化完成后,利用反射技術(shù)實現(xiàn)屬性及依賴Bean的注入。

(4)BeanNameAware的setBeanName()方法:如果某個Bean實現(xiàn)了BeanNameAware接口,那么Spring將會將Bean實例的ID傳遞給setBeanName()方法,在Bean類中新增一個beanName字段,并實現(xiàn)setBeanName()方法。

(5)BeanFactoryAware的setBeanFactory()方法:如果某個Bean實現(xiàn)了BeanFactoryAware接口,那么Spring將會將創(chuàng)建Bean的BeanFactory傳遞給setBeanFactory()方法,在Bean類中新增了一個beanFactory字段用來保存BeanFactory的值,并實現(xiàn)setBeanFactory()方法。

(6)ApplicationContextAware的setApplicationContext()方法:如果某個Bean實現(xiàn)了ApplicationContextAware接口,那么Spring將會將該Bean所在的上下文環(huán)境ApplicationContext傳遞給setApplicationContext()方法,在Bean類中新增一個ApplicationContext字段用來保存ApplicationContext的值,并實現(xiàn)setApplicationContext()方法。

(7)BeanPostProcessor預初始化方法:如果某個IoC容器中增加的實現(xiàn)BeanPostProcessor接口的實現(xiàn)類Bean,那么在該容器中實例化Bean之后,執(zhí)行初始化之前會調(diào)用BeanPostProcessor中的postProcessBeforeInitialization()方法執(zhí)行預初始化處理。

(8)InitializingBean的afterPropertiesSet()方法:如果Bean實現(xiàn)了InitializingBean接口,那么Bean在實例化完成后將會執(zhí)行接口中的afterPropertiesSet()方法來進行初始化。

(9)自定義的inti-method指定的方法:如果配置文件中使用init-method屬性指定了初始化方法,那么Bean在實例化完成后將會調(diào)用該屬性指定的初始化方法進行Bean的初始化。

(10)BeanPostProcessor初始化后方法:如果某個IoC容器中增加的實現(xiàn)BeanPostProcessor接口的實現(xiàn)類Bean,那么在該容器中實例化Bean之后并且完成初始化調(diào)用后執(zhí)行該接口中的postProcessorAfterInitialization()方法進行初始化后處理。

(11)使用Bean:此時有關(guān)Bean的所有準備工作均已完成,Bean可以被程序使用了,它們將會一直駐留在應用上下文中,直到該上下文環(huán)境被銷毀。

(12)DisposableBean的destory()方法:如果Bean實現(xiàn)了DisposableBean接口,Spring將會在Bean實例銷毀之前調(diào)用該接口的destory()方法,來完成一些銷毀之前的處理工作。

(13)自定義的destory-method指定的方法:如果在配置文件中使用destory-method指定了銷毀方法,那么在Bean實例銷毀之前會調(diào)用該指定的方法完成一些銷毀之前的處理工作。

注意:

1、BeanFactoryPostProcessor接口與BeanPostProcessor接口的作用范圍是整個上下文環(huán)境中,使用方法是單獨新增一個類來實現(xiàn)這些接口,那么在處理其他Bean的某些時刻就會回調(diào)響應的接口中的方法。

2、BeanNameAware、BeanFactoryAware、ApplicationContextAware的作用范圍的Bean范圍,即僅僅對實現(xiàn)了該接口的指定Bean有效,所有其使用方法是在要使用該功能的Bean自己來實現(xiàn)該接口。

3、第8點與第9點所述的兩個初始化方法作用是一樣的,我們完全可以使用其中的一種即可,一般情況我們使用第9點所述的方式,盡量少的去來Bean中實現(xiàn)某些接口,保持其獨立性,低耦合性,盡量不要與Spring代碼耦合在一起。第12和第13也是如此。

4、 在BeaFactoryAware's setBeanFactory()和Pre-initialization BeanPostProcessor之間還應該有一步:調(diào)用ApplicationContextAware的setApplicationContext()方法。
可以看到Bean生命周期要經(jīng)歷很多階段,但這些階段大部分都是可選的。例如,某個Bean如果實現(xiàn)了BeanFactoryAware接口的setBeanFactory方法,那么該Bean的生命就會經(jīng)歷這個階段,如果不實現(xiàn)則沒有。

使用

public class Book implements BeanNameAware, BeanFactoryAware,
    ApplicationContextAware, InitializingBean, DisposableBean {
  private String bookName;
  public Book(){
    System.out.println("Book Initializing ");
  }
  @Override
  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    System.out.println("Book.setBeanFactory invoke");
  }
  @Override
  public void setBeanName(String name) {
    System.out.println("Book.setBeanName invoke");
  }
  @Override
  public void destroy() throws Exception {
    System.out.println("Book.destory invoke");
  }
  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("Book.afterPropertiesSet invoke");
  }
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    System.out.println("Book.setApplicationContext invoke");
  }
  public String getBookName() {
    return bookName;
  }
  public void setBookName(String bookName) {
    this.bookName = bookName;
    System.out.println("setBookName: Book name has set.");
  }
  public void myPostConstruct(){
    System.out.println("Book.myPostConstruct invoke");
  }
  // 自定義初始化方法
  @PostConstruct
  public void springPostConstruct(){
    System.out.println("@PostConstruct");
  }
  public void myPreDestory(){
    System.out.println("Book.myPreDestory invoke");
    System.out.println("---------------destroy-----------------");
  }
  // 自定義銷毀方法
  @PreDestroy
  public void springPreDestory(){
    System.out.println("@PreDestory");
  }
  @Override
  protected void finalize() throws Throwable {
    System.out.println("------inside finalize-----");
  }
}
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  public MyBeanFactoryPostProcessor() {
    super();
    System.out.println("這是BeanFactoryPostProcessor實現(xiàn)類構(gòu)造器??!");
  }
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
      throws BeansException {
    System.out
        .println("BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法");
    BeanDefinition bd = arg0.getBeanDefinition("book");
    bd.getPropertyValues().addPropertyValue("bookName", "ddd");
  }
}
// 通過注入調(diào)用
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    if(bean instanceof Book){
      System.out.println("MyBeanPostProcessor.postProcessBeforeInitialization");
    }
    return bean;
  }
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    if(bean instanceof Book){
      System.out.println("MyBeanPostProcessor.postProcessAfterInitialization");
    }
    return bean;
  }
}

// ClassPathXmlApplicationContext 這個類實例化就會調(diào)用這個類
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
  public MyBeanFactoryPostProcessor() {
    super();
    System.out.println("這是BeanFactoryPostProcessor實現(xiàn)類構(gòu)造器??!");
  }
  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
      throws BeansException {
    System.out
        .println("BeanFactoryPostProcessor調(diào)用postProcessBeanFactory方法");
    BeanDefinition bd = arg0.getBeanDefinition("book");
    bd.getPropertyValues().addPropertyValue("bookName", "ddd");
  }
}
// InstantiationAwareBeanPostProcessor 接口本質(zhì)是BeanPostProcessor的子接口,一般我們繼承Spring為其提供的適配器類InstantiationAwareBeanPostProcessor Adapter來使用它,如下:
public class MyInstantiationAwareBeanPostProcessor extends
    InstantiationAwareBeanPostProcessorAdapter {
  public MyInstantiationAwareBeanPostProcessor() {
    super();
    System.out
        .println("這是InstantiationAwareBeanPostProcessorAdapter實現(xiàn)類構(gòu)造器!!");
  }
  // 接口方法、實例化Bean之前調(diào)用
  @Override
  public Object postProcessBeforeInstantiation(Class beanClass,
                         String beanName) throws BeansException {
    System.out
        .println("InstantiationAwareBeanPostProcessor調(diào)用postProcessBeforeInstantiation方法");
    return null;
  }
// 接口方法、實例化Bean之后調(diào)用
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName)
      throws BeansException {
    System.out
        .println("InstantiationAwareBeanPostProcessor調(diào)用postProcessAfterInitialization方法");
    return bean;
  }
// 接口方法、設(shè)置某個屬性時調(diào)用
  @Override
  public PropertyValues postProcessPropertyValues(PropertyValues pvs,
                          PropertyDescriptor[] pds, Object bean, String beanName)
      throws BeansException {
    System.out
        .println("InstantiationAwareBeanPostProcessor調(diào)用postProcessPropertyValues方法");
    return pvs;
  }
}
// bean配置
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">

  <bean id="beanPostProcessor" class="com.example.demo.MyBeanPostProcessor">
  </bean>

  <bean id="instantiationAwareBeanPostProcessor" class="com.example.demo.MyInstantiationAwareBeanPostProcessor">
  </bean>

  <bean id="beanFactoryPostProcessor" class="com.example.demo.MyBeanFactoryPostProcessor">
  </bean>

  <bean id="book" class="com.example.demo.Book" init-method="myPostConstruct" destroy-method="myPreDestory">
    <!-- 注入bean 屬性名稱 -->
    <property name="bookName" value="thingking in java" />
  </bean>
</beans>
//調(diào)用
    ApplicationContext context = new ClassPathXmlApplicationContext("beanconfig.xml");
    Book book = (Book)context.getBean("book");
    System.out.println("Book name = " + book.getBookName());
    ((ClassPathXmlApplicationContext) context).destroy();

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

相關(guān)文章

  • 關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因?qū)崙?zhàn)記錄

    關(guān)于@DS注解切換數(shù)據(jù)源失敗的原因?qū)崙?zhàn)記錄

    項目配置了多個數(shù)據(jù)源,需要使用@DS注解來切換數(shù)據(jù)源,但是卻遇到了問題,下面這篇文章主要給大家介紹了關(guān)于@DS注解切換數(shù)據(jù)源失敗原因的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • Java Collections集合繼承結(jié)構(gòu)圖_動力節(jié)點Java學院整理

    Java Collections集合繼承結(jié)構(gòu)圖_動力節(jié)點Java學院整理

    這篇文章主要介紹了Java Collections集合繼承結(jié)構(gòu)圖_動力節(jié)點Java學院整理,需要的朋友可以參考下
    2017-04-04
  • 代碼分析Spring MVC的工作原理

    代碼分析Spring MVC的工作原理

    在本篇文章里小編給大家整理了關(guān)于Spring MVC的工作原理的相關(guān)知識點以及實例代碼內(nèi)容,需要的朋友們可以參考下。
    2019-06-06
  • Spring Cloud Ribbon實現(xiàn)客戶端負載均衡的示例

    Spring Cloud Ribbon實現(xiàn)客戶端負載均衡的示例

    本篇文章主要介紹了Spring Cloud Ribbon實現(xiàn)客戶端負載均衡的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • IDEA如何進行commit之后的代碼回退

    IDEA如何進行commit之后的代碼回退

    在 IntelliJ IDEA 中回退 Git 版本涉及查找提交記錄、復制提交編號、重置 HEAD 并強行推送到遠程倉庫,本文提供詳細步驟和注意事項,幫助用戶安全地回退到舊版本
    2024-09-09
  • SpringCloud配置動態(tài)更新原理解析

    SpringCloud配置動態(tài)更新原理解析

    在微服務架構(gòu)的浩瀚星海中,服務配置的動態(tài)更新如同魔法一般,能夠讓應用在不重啟的情況下,實時響應配置的變更,Spring Cloud作為微服務架構(gòu)中的佼佼者,其動態(tài)配置更新的能力尤為引人注目,本文給大家介紹了SpringCloud配置動態(tài)更新原理,需要的朋友可以參考下
    2025-01-01
  • eclipse上配置Maven的圖文教程(推薦)

    eclipse上配置Maven的圖文教程(推薦)

    下面小編就為大家分享一篇eclipse上配置Maven的圖文教程(推薦),具有很好的參考價值。希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • SpringBoot如何利用Twilio?Verify發(fā)送驗證碼短信

    SpringBoot如何利用Twilio?Verify發(fā)送驗證碼短信

    Twilio提供了一個名為?Twilio?Verify?的服務,專門用于處理驗證碼的發(fā)送和驗證,下面我們就來看看如何使用Twilio?Verify實現(xiàn)發(fā)送驗證碼短信吧
    2025-03-03
  • 最新評論

    永年县| 亚东县| 德兴市| 江孜县| 齐河县| 东莞市| 呼伦贝尔市| 宁海县| 威海市| 孝感市| 邓州市| 六安市| 任丘市| 沧州市| 张家港市| 乌拉特中旗| 湘西| 水城县| 九寨沟县| 泸西县| 微山县| 越西县| 汶川县| 都江堰市| 宿迁市| 宁明县| 延长县| 怀宁县| 罗源县| 蚌埠市| 蛟河市| 霍州市| 临城县| 时尚| 福贡县| 定日县| 平乡县| 逊克县| 青冈县| 茶陵县| 民丰县|