最近2018中文字幕在日韩欧美国产成人片_国产日韩精品一区二区在线_在线观看成年美女黄网色视频_国产精品一区三区五区_国产精彩刺激乱对白_看黄色黄大色黄片免费_人人超碰自拍cao_国产高清av在线_亚洲精品电影av_日韩美女尤物视频网站

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
BeanPostProcessor后置處理器在Spring中的作用是什么

本篇文章為大家展示了BeanPostProcessor后置處理器在Spring中的作用是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)建站堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都網(wǎng)站制作、網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的阿爾山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

BeanPostProcessor接口作用:

如果我們想在Spring容器中完成bean實(shí)例化、配置以及其他初始化方法前后要添加一些自己邏輯處理。我們需要定義一個(gè)或多個(gè)BeanPostProcessor接口實(shí)現(xiàn)類,然后注冊(cè)到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)) {//過(guò)濾掉bean實(shí)例ID為narCodeService
      return bean;
    }
    System.out.println("后置處理器處理bean=【"+beanName+"】開(kāi)始");
    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;
  }
}

注意:接口中兩個(gè)方法不能返回null,如果返回null那么在后續(xù)初始化方法將報(bào)空指針異?;蛘咄ㄟ^(guò)getBean()方法獲取不到bena實(shí)例對(duì)象,因?yàn)楹笾锰幚砥鲝腟pring IoC容器中取出bean實(shí)例對(duì)象沒(méi)有再次放回IoC容器中!

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



  
   
   
  
    
    
  
  
  

BeanPostProcessor API:

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

由API可以看出:

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

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

注意:

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

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

void addBeanPostProcessor(BeanPostProcessor beanPostProcessor);

Spring如何調(diào)用多個(gè)BeanPostProcessor實(shí)現(xiàn)類:

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

Spring配置文件:



    
  
  
  
  

BeanPostProcessor實(shí)現(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+"】開(kāi)始");
    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("后置處理器開(kāi)始調(diào)用了");
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      e.printStackTrace();
    }
    return bean;
  }

  @Override
  public Object postProcessAfterInitialization(Object bean,
      String beanName) throws BeansException {
    System.out.println("后置處理器調(diào)用結(jié)束了");
    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容器開(kāi)始初始化了......");
    applicationcontext= new ClassPathXmlApplicationContext(new String[]{"test1-service.xml"});
    System.out.println("》》》Spring ApplicationContext容器初始化完畢了......");
  }
  @Test
  public void test() {
    applicationcontext.registerShutdownHook();  
  }
}

測(cè)試結(jié)果:

》》》Spring ApplicationContext容器開(kāi)始初始化了......
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】開(kāi)始
后置處理器開(kāi)始調(diào)用了
后置處理器處理bean=【narCodeService】完畢!
后置處理器調(diào)用結(jié)束了
》》》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機(jī)制中可以指定后置處理器調(diào)用順序,通過(guò)讓BeanPostProcessor接口實(shí)現(xiàn)類實(shí)現(xiàn)Ordered接口getOrder方法,該方法返回一整數(shù),默認(rèn)值為 0,優(yōu)先級(jí)最高,值越大優(yōu)先級(jí)越低

上述內(nèi)容就是BeanPostProcessor后置處理器在Spring中的作用是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


網(wǎng)頁(yè)題目:BeanPostProcessor后置處理器在Spring中的作用是什么
文章地址:http://fisionsoft.com.cn/article/iheded.html