欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring中的后置處理器BeanPostProcessor詳解

 更新時間:2019年08月06日 16:33:42   作者:情陌人灬已不在  
這篇文章主要介紹了Spring中的后置處理器BeanPostProcessor詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

BeanPostProcessor接口作用:

如果我們想在Spring容器中完成bean實例化、配置以及其他初始化方法前后要添加一些自己邏輯處理。我們需要定義一個或多個BeanPostProcessor接口實現(xiàn)類,然后注冊到Spring IoC容器中。

package com.test.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * bean后置處理器
 * @author zss
 *
 */
public class PostProcessor implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean,
      String beanName) throws BeansException {
    if ("narCodeService".equals(beanName)) {//過濾掉bean實例ID為narCodeService
      return bean;
    }
    System.out.println("后置處理器處理bean=【"+beanName+"】開始");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }
  @Override
  public Object postProcessAfterInitialization(Object bean,
      String beanName) throws BeansException {
    if ("narCodeService".equals(beanName)) {
      return bean;
    }
    System.out.println("后置處理器處理bean=【"+beanName+"】完畢!");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }
}

注意:接口中兩個方法不能返回null,如果返回null那么在后續(xù)初始化方法將報空指針異?;蛘咄ㄟ^getBean()方法獲取不到bena實例對象,因為后置處理器從Spring IoC容器中取出bean實例對象沒有再次放回IoC容器中!

將Spring的后置處理器PostProcessor配置到Spring配置文件中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- 定義一個bean -->
   <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
   </bean>
  <bean id="beanLifecycle" class="com.test.spring.BeanLifecycle" init-method="init" destroy-method="close">
    <property name="name" value="張三"></property>
    <property name="sex" value="男"></property>
  </bean>
  <!-- Spring后置處理器 -->
  <bean id="postProcessor" class="com.test.spring.PostProcessor"/>
</beans>

BeanPostProcessor API:

public interface BeanPostProcessor {  
  //實例化、依賴注入完畢,在調用顯示的初始化之前完成一些定制的初始化任務 
  Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;    
  //實例化、依賴注入、初始化完畢時執(zhí)行 
  Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException; 
}

由API可以看出:

1:后置處理器的postProcessorBeforeInitailization方法是在bean實例化,依賴注入之后及自定義初始化方法(例如:配置文件中bean標簽添加init-method屬性指定Java類中初始化方法、
@PostConstruct注解指定初始化方法,Java類實現(xiàn)InitailztingBean接口)之前調用

2:后置處理器的postProcessorAfterInitailization方法是在bean實例化、依賴注入及自定義初始化方法之后調用

注意:

1.BeanFactory和ApplicationContext兩個容器對待bean的后置處理器稍微有些不同。ApplicationContext容器會自動檢測Spring配置文件中那些bean所對應的Java類實現(xiàn)了BeanPostProcessor
接口,并自動把它們注冊為后置處理器。在創(chuàng)建bean過程中調用它們,所以部署一個后置處理器跟普通的bean沒有什么太大區(qū)別。

2.BeanFactory容器注冊bean后置處理器時必須通過代碼顯示的注冊,在IoC容器繼承體系中的ConfigurableBeanFactory接口中定義了注冊方法

void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

Spring如何調用多個BeanPostProcessor實現(xiàn)類:

我們可以在Spring配置文件中添加多個BeanPostProcessor(后置處理器)接口實現(xiàn)類,在默認情況下Spring容器會根據(jù)后置處理器的定義順序來依次調用。

Spring配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans    http://www.springframework.org/schema/beans/spring-beans.xsd">
  <!-- bean定義 -->  
  <bean id="narCodeService" class="com.test.service.impl.NarCodeServiceImpl">
  </bean>
  <bean id="postProcessor" class="com.test.spring.PostProcessor"/>
  <bean id="postProcessorB" class="com.test.spring.PostProcessorB"/>
</beans>

BeanPostProcessor實現(xiàn)類:

package com.test.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
/**
 * bean后置處理器
 * @author zss
 *
 */
public class PostProcessor implements BeanPostProcessor {

  @Override
  public Object postProcessBeforeInitialization(Object bean,
      String beanName) throws BeansException {
    System.out.println("后置處理器處理bean=【"+beanName+"】開始");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean,
      String beanName) throws BeansException {
    System.out.println("后置處理器處理bean=【"+beanName+"】完畢!");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }
}
----------------------------------------------------------------------------------------------------------------------------------------
package com.test.spring;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
public class PostProcessorB implements BeanPostProcessor {
  @Override
  public Object postProcessBeforeInitialization(Object bean,
      String beanName) throws BeansException {
    System.out.println("后置處理器開始調用了");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean,
      String beanName) throws BeansException {
    System.out.println("后置處理器調用結束了");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }
}

Test case:

package com.test.spring;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class T {
  AbstractApplicationContext applicationcontext=null;
  @Before
  public void before() {
    System.out.println("》》》Spring ApplicationContext容器開始初始化了......");
    applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
    System.out.println("》》》Spring ApplicationContext容器初始化完畢了......");
  }
  @Test
  public void test() {
    applicationcontext.registerShutdownHook();  
  }
}

測試結果:

》》》Spring ApplicationContext容器開始初始化了......
2017-03-19 10:50:29 INFO:ClassPathXmlApplicationContext-Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9: startup date [Sun Mar 19 10:50:29 CST 2017]; root of context hierarchy
2017-03-19 10:50:29 INFO:XmlBeanDefinitionReader-Loading XML bean definitions from class path resource [test1-service.xml]
后置處理器處理bean=【narCodeService】開始
后置處理器開始調用了
后置處理器處理bean=【narCodeService】完畢!
后置處理器調用結束了
》》》Spring ApplicationContext容器初始化完畢了......
2017-03-19 10:50:34 INFO:ClassPathXmlApplicationContext-Closing org.springframework.context.support.ClassPathXmlApplicationContext@18c92ff9: startup date [Sun Mar 19 10:50:29 CST 2017]; root of context hierarchy

在Spring機制中可以指定后置處理器調用順序,通過讓BeanPostProcessor接口實現(xiàn)類實現(xiàn)Ordered接口getOrder方法,該方法返回一整數(shù),默認值為 0,優(yōu)先級最高,值越大優(yōu)先級越低

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

相關文章

  • SpringBoot整合rabbitMq自定義消息轉換方式

    SpringBoot整合rabbitMq自定義消息轉換方式

    這篇文章主要介紹了SpringBoot整合rabbitMq自定義消息轉換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java并發(fā)之嵌套管程鎖死詳解

    Java并發(fā)之嵌套管程鎖死詳解

    這篇文章主要介紹了Java并發(fā)之嵌套管程鎖死詳解,涉及嵌套管程鎖死的發(fā)生,實例等相關內(nèi)容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • mybatis insert返回主鍵代碼實例

    mybatis insert返回主鍵代碼實例

    這篇文章主要介紹了mybatis insert返回主鍵代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-12-12
  • 哲學家就餐問題中的JAVA多線程學習

    哲學家就餐問題中的JAVA多線程學習

    哲學家就餐問題是1965年由Dijkstra提出的一種線程同步的問題,下面我們就看一下JAVA多線程如何做
    2013-11-11
  • SpringBoot3集成WebSocket的全過程

    SpringBoot3集成WebSocket的全過程

    WebSocket通過一個TCP連接在客戶端和服務器之間建立一個全雙工、雙向的通信通道,使得客戶端和服務器之間的數(shù)據(jù)交換變得更加簡單,本文給大家介紹了SpringBoot3集成WebSocket的全過程,并有相關的代碼示例供大家參考,需要的朋友可以參考下
    2024-05-05
  • Spring cloud alibaba之Ribbon負載均衡實現(xiàn)方案

    Spring cloud alibaba之Ribbon負載均衡實現(xiàn)方案

    Spring cloud Ribbon是基于Netflix Ribbon實現(xiàn)的一套客戶端的負載均衡工具,Ribbon客戶端提供一系列完善的配置,如超時、重試等,Ribbon也可以實現(xiàn)自己的負載均衡算法,感興趣的朋友跟隨小編一起看看吧
    2021-07-07
  • Java如何把map分割成多個map

    Java如何把map分割成多個map

    這篇文章主要介紹了Java如何把map分割成多個map,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-08-08
  • 使用@Autowired注解引入server服務層方法時報錯的解決

    使用@Autowired注解引入server服務層方法時報錯的解決

    這篇文章主要介紹了使用@Autowired注解引入server服務層方法時報錯的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 18個Java8日期處理的實踐(太有用了)

    18個Java8日期處理的實踐(太有用了)

    這篇文章主要介紹了18個Java8日期處理的實踐(太有用了),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • this關鍵字詳解

    this關鍵字詳解

    這篇文章主要介紹了this關鍵字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03

最新評論