Java BeanPostProcessor與BeanFactoryPostProcessor基礎(chǔ)使用講解
前言
BeanPostProcessor 接口定義了一個你可以自己實(shí)現(xiàn)的回調(diào)方法,來實(shí)現(xiàn)你自己的實(shí)例化邏輯、依賴解決邏輯等,如果你想要在Spring完成對象實(shí)例化、配置、初始化之后實(shí)現(xiàn)自己的業(yè)務(wù)邏輯,你可以補(bǔ)充實(shí)現(xiàn)一個或多個BeanPostProcessor的實(shí)現(xiàn)。
BeanFactoryPostProcessor的定義和BeanPostProcessor相似,有一個最主要的不同是:BeanFactoryPostProcessor可以對bean的配置信息進(jìn)行操作;更確切的說Spring IOC容器允許BeanFactoryPostProcessor讀取配置信息并且能夠在容器實(shí)例化任何其他bean(所有的實(shí)現(xiàn)了BeanFactoryPostProcessor接口的類)之前改變配置信息
BeanPostProcessor
接口定義
public interface BeanPostProcessor {
@Nullable
default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
@Nullable
default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
}postProcessBeforeInitialization和postProcessAfterInitialization
入?yún)⑹?bean示例和beanName,此方法內(nèi)可以對bean進(jìn)行處理并且返回一個對象,更改bean實(shí)例,例如代理,修改對象數(shù)據(jù)
執(zhí)行時(shí)機(jī)
執(zhí)行時(shí)機(jī)參考
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
}
try {
invokeInitMethods(beanName, wrappedBean, mbd);
}
catch (Throwable ex) {
throw new BeanCreationException(
(mbd != null ? mbd.getResourceDescription() : null),
beanName, "Invocation of init method failed", ex);
}
if (mbd == null || !mbd.isSynthetic()) {
wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}即整個bean已經(jīng)加載完畢,依賴的bean已經(jīng)注入完畢,分別在,執(zhí)行初始化方法前和方法后執(zhí)行
初始化方法指的是執(zhí)行InitializingBean的afterPropertiesSet方法
初始化方法指的是bean實(shí)現(xiàn)了InitializingBean接口,對應(yīng)的方法為afterPropertiesSet
BeanFactoryPostProcessor
接口定義
FunctionalInterface
public interface BeanFactoryPostProcessor {
void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;
}入?yún)⒕褪莃eanFactory,可以對beanFactory進(jìn)行修改
例如通過beanFactory修改beanDefination,添加屬性
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
System.out.println("調(diào)用MyBeanFactoryPostProcessor的postProcessBeanFactory");
BeanDefinition bd = beanFactory.getBeanDefinition("myJavaBean");
MutablePropertyValues pv = bd.getPropertyValues();
if (pv.contains("remark")) {
pv.addPropertyValue("remark", "在BeanFactoryPostProcessor中修改之后的備忘信息");
}
}
}執(zhí)行時(shí)機(jī)
在bean實(shí)例化之前執(zhí)行,在invokeBeanFactoryPostProcessors中。
到此這篇關(guān)于Java BeanPostProcessor與BeanFactoryPostProcessor基礎(chǔ)使用講解的文章就介紹到這了,更多相關(guān)Java BeanPostProcessor內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java遞歸以及根據(jù)節(jié)點(diǎn)取子集合方式
文章介紹了Java中遞歸的使用方法,包括如何根據(jù)節(jié)點(diǎn)構(gòu)建樹形結(jié)構(gòu)以及如何反向遞歸獲取所有子節(jié)點(diǎn),提供了遞歸方法的參數(shù)解釋和示例代碼,希望對大家有所幫助2024-12-12
Struts2學(xué)習(xí)教程之輸入校驗(yàn)示例詳解
這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)教程之輸入校驗(yàn)的相關(guān)資料,文中通過示例介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用struts2具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-05-05
IDEA 如何導(dǎo)入別人的javaweb項(xiàng)目進(jìn)行部署
這篇文章主要介紹了IDEA 如何導(dǎo)入別人的javaweb項(xiàng)目進(jìn)行部署,本文給大家分享我的詳細(xì)部署過程及遇到問題解決方法,需要的朋友可以參考下2023-03-03
java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串2種方法
在我們?nèi)粘i_發(fā)中,在前后端交互的時(shí)候會遇到多個id或其他字段存放到一個字段中,這時(shí)我們會遇到一個List(集合)---->String(單個字段),這篇文章主要給大家介紹了關(guān)于java中List數(shù)組用逗號分隔開轉(zhuǎn)成字符串的2種方法,需要的朋友可以參考下2023-10-10
java springboot poi 從controller 接收不同類型excel 文件處理
這篇文章主要介紹了java springboot poi 從controller 接收不同類型excel 文件處理,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
Spring-cloud Config Server的3種配置方式
這篇文章主要介紹了Spring-cloud Config Server的3種配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09

