亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring bean生命周期驗證的示例分析

發布時間:2021-08-09 09:56:58 來源:億速云 閱讀:112 作者:小新 欄目:編程語言

這篇文章主要為大家展示了“Spring bean生命周期驗證的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“Spring bean生命周期驗證的示例分析”這篇文章吧。

一、從源碼注釋看bean生命周期

從JDK源碼上看,BeanFactory實現類需要支持Bean的完整生命周期,完整的初始化方法及其標準順序(格式:接口 方法)為:

1.BeanNameAware setBeanName 設置bean名稱
2.BeanClassLoaderAware setBeanClassLoader 設置bean類加載器
3.BeanFactoryAware setBeanFactory 設置bean工廠
4.EnvironmentAware setEnvironment 設置環境:profiles+properties
5.EmbeddedValueResolverAware setEmbeddedValueResolver 設置嵌入式值解析器
6.ResourceLoaderAware setResourceLoader 設置資源載入器,只適用于在應用程序上下文中運行
7.ApplicationEventPublisherAware setApplicationEventPublisher注入應用事件發布器ApplicationEventPublisher
8.MessageSourceAware setMessageSource 設置國際化支持
9.ApplicationContextAware setApplicationContext 設置應用上下文
10.ServletContextAware setServletContext 設置servlet上下文
11.BeanPostProcessors postProcessBeforeInitialization 執行bean處理器前置方法
12.InitializingBean afterPropertiesSet 執行初始化Bean設置完屬性后置方法
13.a custom init-method definition 執行自定義初始化方法
14.BeanPostProcessors postProcessAfterInitialization 執行bean處理器后置方法

銷毀順序:

1.DestructionAwareBeanPostProcessors postProcessBeforeDestruction 銷毀處理器的前置方法
2.DisposableBean destroy Bean銷毀回調方法
3.a custom destroy-method definition 用戶自定義銷毀方法

核心方法流程圖:

Spring bean生命周期驗證的示例分析

二、測試驗證

2.1分析原理

前面說的17個步驟都可以測試,我們選取其中的8個步驟進行測試如下:

初始化流程:

1.BeanNameAware setBeanName 設置bean名稱
3.BeanFactoryAware setBeanFactory 設置bean工廠
11.BeanPostProcessors postProcessBeforeInitialization 執行bean處理器前置方法
12.InitializingBean afterPropertiesSet 執行初始化Bean設置完屬性后置方法
13.a custom init-method definition 執行自定義初始化方法
14.BeanPostProcessors postProcessAfterInitialization 執行bean處理器后置方法

銷毀流程:

2.DisposableBean destroy Bean銷毀回調方法
3.a custom destroy-method definition 用戶自定義銷毀方法

 2.2 代碼清單

 1.構建一個Person類,實現BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean接口。

package spring.ioc;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
  
  private String name;
  
  private String mobile;
   
  public Person() {
    super();
    System.out.println("[構造器] 調用Person的構造器實例化");
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    System.out.println("[屬性注入] name="+name);
    this.name = name;
  }

  public String getMobile() {
    return mobile;
  }

  public void setMobile(String mobile) {
    System.out.println("[屬性注入] mobile="+mobile);
    this.mobile = mobile;
  }

  @Override
  public void destroy() throws Exception {
    System.out.println("[接口DisposableBean.destroy() ]");
  }

  @Override
  public void afterPropertiesSet() throws Exception {
    System.out.println("[接口InitializingBean.afterPropertiesSet() ]");
  }

  @Override
  public void setBeanName(String name) {
    System.out.println("[接口BeanNameAware.setBeanName() ]");
  }

  @Override
  public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
    System.out.println("[接口BeanFactoryAware.setBeanFactory() ]");
  }

  public void myInit(){
    System.out.println("[init-method]調用<bean>的init-method屬性指定的初始化方法");
  }
  
  public void myDestory() {
    System.out.println("[destroy-method]調用<bean>的destroy-method屬性指定的銷毀方法");
  }

}

2.自定義工廠后處理器,復寫postProcessBeanFactory方法,獲取bean定義后添加屬性mobile=110

package spring.ioc;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;

/**
 * 
 * @ClassName:MyBeanFactoryPostProcessor
 * @Description:自定義工廠后處理器
 * @author diandian.zhang
 * @date 2017年10月25日下午7:14:09
 */
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {

  public MyBeanFactoryPostProcessor() {
    super();
    System.out.println("[MyBeanFactoryPostProcessor工廠后處理器]BeanFactoryPostProcessor實現類構造器!!");
  }

  @Override
  public void postProcessBeanFactory(ConfigurableListableBeanFactory arg0)
      throws BeansException {
    System.out.println("[MyBeanFactoryPostProcessor工廠后處理器]BeanFactoryPostProcessor.postProcessBeanFactory()獲取bean定義后添加屬性mobile=110");
    BeanDefinition bd = arg0.getBeanDefinition("person");
    bd.getPropertyValues().addPropertyValue("mobile", "110");
  }

}

3.自定義Bean后處理器,復寫postProcessBeforeInitialization和postProcessAfterInitialization2個方法,分別對應初始化前后時的操作。

package spring.ioc;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
 * 
 * @ClassName:MyBeanPostProcessor
 * @Description:自定義Bean后處理器
 * @author diandian.zhang
 * @date 2017年10月25日下午7:03:53
 */
public class MyBeanPostProcessor implements BeanPostProcessor {

  public MyBeanPostProcessor() {
    super();
    System.out.println("這是BeanPostProcessor實現類構造器!!");
  }

  /**
   * 
   * @Description 初始化前,處理器
   * @param bean
   * @param beanName
   * @return
   * @throws BeansException
   * @author diandian.zhang
   * @date 2017年10月25日下午7:07:02
   * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization(java.lang.Object, java.lang.String)
   */
  @Override
  public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改!beanName="+beanName);
    return bean;
  }
  
  /**
   * 
   * @Description 初始化后,處理器
   * @param bean
   * @param beanName
   * @return
   * @throws BeansException
   * @author diandian.zhang
   * @date 2017年10月25日下午7:07:07
   * @see org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization(java.lang.Object, java.lang.String)
   */
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
    System.out.println("BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改!beanName="+beanName);
    return bean;//注意,如果返回null,后續BeanPostProcessor不會再執行
  }

  
}

4.自定義實例化bean后處理器適配器,復寫postProcessBeforeInstantiation、postProcessBeforeInstantiation、postProcessPropertyValues分別對應實例化Bean前調用、實例化Bean后調用、設置某個屬性時調用

注意:InstantiationAwareBeanPostProcessorAdapter ,這里是實例化Instantiation,不是初始化Initialization!!!

package spring.ioc;

import java.beans.PropertyDescriptor;

import org.springframework.beans.BeansException;
import org.springframework.beans.PropertyValues;
import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessorAdapter;

/**
 * 
 * @ClassName:MyInstantiationAwareBeanPostProcessor
 * @Description:BeanPostProcessor的子類,增加了更多自定方法
 * @author diandian.zhang
 * @date 2017年10月25日下午7:09:15
 */
public class MyInstantiationAwareBeanPostProcessor extends
    InstantiationAwareBeanPostProcessorAdapter {

  public MyInstantiationAwareBeanPostProcessor() {
    super();
    System.out.println("這是InstantiationAwareBeanPostProcessorAdapter實現類構造器!!");
  }

  // 接口方法、實例化Bean之前調用
  @Override
  public Object postProcessBeforeInstantiation(Class<?> beanClass,String beanName) throws BeansException {
    System.out.println("InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法[實例化Bean之前調用 ]beanname="+beanName);
    return null;
  }

  // 接口方法、實例化Bean之后調用
  @Override
  public Object postProcessAfterInitialization(Object bean, String beanName)
      throws BeansException {
    System.out .println("InstantiationAwareBeanPostProcessor調用postProcessAfterInitialization方法[實例化Bean之后調用]beanname="+beanName);
    return bean;
  }

  // 接口方法、設置某個屬性時調用
  @Override
  public PropertyValues postProcessPropertyValues(PropertyValues pvs,
      PropertyDescriptor[] pds, Object bean, String beanName)
      throws BeansException {
    System.out.println("InstantiationAwareBeanPostProcessor調用postProcessPropertyValues方法 pvs="+pvs+",beanName="+beanName);
    return pvs;
  }
}

5.測試類,使用ClassPathXmlApplicationContext從xml中讀取bean配置文件生成applicationContext容器應用上下文,這一步對應容器初始化。第二部從應用上下文中獲取bean。最后一步注冊一個關閉鉤子,在容器關閉時觸發。

package spring.ioc;

import org.junit.Test; 6 import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;10 
import spring.aop.xml.dao.Dao;

/**
 * 
 * @ClassName:IOCTest
 * @Description:測試類
 * @author diandian.zhang
 * @date 2017年10月25日下午4:42:01
 */
public class IOCTest {
  
  @Test
  public void iocPersonTest(){
    System.out.println("=============容器初始化======start=========");
    @SuppressWarnings("resource")
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("simple_spring_bean.xml");//源碼入口
    System.out.println("=============容器初始化=======end========");
    System.out.println("=============獲取person bean====start=======");
    Person person = applicationContext.getBean("person",Person.class);//獲取Bean
    System.out.println("=============獲取person bean====end=======,person類名="+person.getClass().getName());
    System.out.println("=============注冊關閉鉤子,關閉容器(JVM shutdown)時觸發鉤子!================");
    ((ClassPathXmlApplicationContext)applicationContext).registerShutdownHook();
  }
}

直接運行,結果如下:

=============容器初始化======start=========
log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).
log4j:WARN Please initialize the log4j system properly.
[MyBeanFactoryPostProcessor工廠后處理器]BeanFactoryPostProcessor實現類構造器!!
[MyBeanFactoryPostProcessor工廠后處理器]BeanFactoryPostProcessor.postProcessBeanFactory()獲取bean定義后添加屬性mobile=110
這是BeanPostProcessor實現類構造器!!
這是InstantiationAwareBeanPostProcessorAdapter實現類構造器!!
InstantiationAwareBeanPostProcessor調用postProcessBeforeInstantiation方法[實例化Bean之前調用 ]beanname=person
[構造器] 調用Person的構造器實例化
InstantiationAwareBeanPostProcessor調用postProcessPropertyValues方法 pvs=PropertyValues: length=2; bean property 'mobile'; bean property 'name',beanName=person
[屬性注入] mobile=110
[屬性注入] name=張三
[接口BeanNameAware.setBeanName() ]
[接口BeanFactoryAware.setBeanFactory() ]
BeanPostProcessor接口方法postProcessBeforeInitialization對屬性進行更改!beanName=person
[接口InitializingBean.afterPropertiesSet() ]
[init-method]調用<bean>的init-method屬性指定的初始化方法
BeanPostProcessor接口方法postProcessAfterInitialization對屬性進行更改!beanName=person
InstantiationAwareBeanPostProcessor調用postProcessAfterInitialization方法[實例化Bean之后調用]beanname=person
=============容器初始化=======end========
=============獲取person bean====start=======
=============獲取person bean====end=======,person類名=spring.ioc.Person
=============注冊關閉鉤子,關閉容器(JVM shutdown)時觸發鉤子!================
[接口DisposableBean.destroy() ]
[destroy-method]調用<bean>的destroy-method屬性指定的銷毀方法

總結流程:

Spring bean生命周期驗證的示例分析

Spring bean生命周期驗證的示例分析

以上是“Spring bean生命周期驗證的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

申扎县| 平定县| 大港区| 龙陵县| 淳化县| 廉江市| 南城县| 无锡市| 汽车| 青川县| 林芝县| 芦溪县| 铁岭县| 玉溪市| 南通市| 丹江口市| 枣强县| 平武县| 社会| 新巴尔虎左旗| 浏阳市| 武邑县| 都安| 静宁县| 漳浦县| 山东省| 启东市| 长海县| 中卫市| 温宿县| 潼南县| 龙门县| 如东县| 云龙县| 栾川县| 资讯| 盱眙县| 仁怀市| 宣城市| 长子县| 石棉县|