解析Java的Spring框架的BeanPostProcessor發(fā)布處理器
BeanPostProcessor 的接口定義,可以實(shí)現(xiàn)提供自己的實(shí)例化邏輯,依賴解析邏輯等,也可以以后在Spring容器實(shí)例化完畢,配置和初始化一個(gè)bean通過插入一個(gè)或多個(gè)的BeanPostProcessor實(shí)現(xiàn)一些自定義邏輯回調(diào)方法實(shí)現(xiàn)。
可以配置多個(gè)的BeanPostProcessor接口,控制這些的BeanPostProcessor接口,通過設(shè)置屬性順序執(zhí)行順序提供的BeanPostProcessor實(shí)現(xiàn)了Ordered接口。
BeanPostProcessor可以對(duì)bean(或?qū)ο螅┎僮鲗?shí)例,這意味著Spring IoC容器實(shí)例化一個(gè)bean實(shí)例,然后BeanPostProcessor的接口做好自己的工作。
ApplicationContext會(huì)自動(dòng)檢測(cè)已定義實(shí)現(xiàn)的BeanPostProcessor接口和注冊(cè)這些bean類為后置處理器,可然后通過在容器創(chuàng)建bean,在適當(dāng)時(shí)候調(diào)用任何bean。
示例:
下面的示例顯示如何編寫,注冊(cè)和使用BeanPostProcessor 可以在一個(gè)ApplicationContext 的上下文。
使用Eclipse IDE,然后按照下面的步驟來創(chuàng)建一個(gè)Spring應(yīng)用程序:

這里是 HelloWorld.java 文件的內(nèi)容:
package com.yiibai;
public class HelloWorld {
private String message;
public void setMessage(String message){
this.message = message;
}
public void getMessage(){
System.out.println("Your Message : " + message);
}
public void init(){
System.out.println("Bean is going through init.");
}
public void destroy(){
System.out.println("Bean will destroy now.");
}
}
這是實(shí)現(xiàn)BeanPostProcessor,之前和之后的任何bean的初始化它打印一個(gè)bean的名字非常簡(jiǎn)單的例子??梢砸?yàn)橛袃蓚€(gè)后處理器的方法對(duì)內(nèi)部bean對(duì)象訪問之前和實(shí)例化一個(gè)bean后執(zhí)行更復(fù)雜的邏輯。
這里是InitHelloWorld.java文件的內(nèi)容:
package com.yiibai;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.beans.BeansException;
public class InitHelloWorld implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean,
String beanName) throws BeansException {
System.out.println("BeforeInitialization : " + beanName);
return bean; // you can return any other object as well
}
public Object postProcessAfterInitialization(Object bean,
String beanName) throws BeansException {
System.out.println("AfterInitialization : " + beanName);
return bean; // you can return any other object as well
}
}
以下是MainApp.java 文件的內(nèi)容。在這里,需要注冊(cè)一個(gè)關(guān)閉掛鉤registerShutdownHook() 是在AbstractApplicationContext類中聲明的方法。這將確保正常關(guān)閉,并調(diào)用相關(guān)的destroy方法。
package com.yiibai;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainApp {
public static void main(String[] args) {
AbstractApplicationContext context =
new ClassPathXmlApplicationContext("Beans.xml");
HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
obj.getMessage();
context.registerShutdownHook();
}
}
下面是init和destroy方法需要的配置文件beans.xml文件:
<?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-3.0.xsd">
<bean id="helloWorld" class="com.yiibai.HelloWorld"
init-method="init" destroy-method="destroy">
<property name="message" value="Hello World!"/>
</bean>
<bean class="com.yiibai.InitHelloWorld" />
</beans>
創(chuàng)建源代碼和bean配置文件完成后,讓我們運(yùn)行應(yīng)用程序。如果一切順利,這將打印以下信息:
BeforeInitialization : helloWorld Bean is going through init. AfterInitialization : helloWorld Your Message : Hello World! Bean will destroy now.
- Spring?BeanPostProcessor后處理器源碼解析
- 關(guān)于Spring BeanPostProcessor的執(zhí)行順序
- Spring BeanPostProcessor(后置處理器)的用法
- SpringBoot之通過BeanPostProcessor動(dòng)態(tài)注入ID生成器案例詳解
- Spring容器的創(chuàng)建過程之如何注冊(cè)BeanPostProcessor詳解
- 詳解使用Spring的BeanPostProcessor優(yōu)雅的實(shí)現(xiàn)工廠模式
- Spring中的后置處理器BeanPostProcessor詳解
- Spring BeanPostProcessor接口使用詳解
- spring中BeanPostProcessor的作用和使用注意事項(xiàng)
相關(guān)文章
Eclipse中查看android工程代碼出現(xiàn)"android.jar has no source attachment
這篇文章主要介紹了Eclipse中查看android工程代碼出現(xiàn)"android.jar has no source attachment"的解決方案,需要的朋友可以參考下2016-05-05
Java NIO三大組件與ByteBuffer深入理解及使用
這篇文章主要介紹了Java NIO三大組件與ByteBuffer,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2023-01-01
Java數(shù)據(jù)結(jié)構(gòu)之LinkedList的用法詳解
鏈表(Linked?list)是一種常見的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu),是一種線性表。Java的LinkedList(鏈表)?類似于?ArrayList,是一種常用的數(shù)據(jù)容器,本文就來簡(jiǎn)單講講它的使用吧2023-05-05
在SpringBoot中,如何使用Netty實(shí)現(xiàn)遠(yuǎn)程調(diào)用方法總結(jié)
我們?cè)谶M(jìn)行網(wǎng)絡(luò)連接的時(shí)候,建立套接字連接是一個(gè)非常消耗性能的事情,特別是在分布式的情況下,用線程池去保持多個(gè)客戶端連接,是一種非常消耗線程的行為.那么我們?cè)撏ㄟ^什么技術(shù)去解決上述的問題呢,那么就不得不提一個(gè)網(wǎng)絡(luò)連接的利器——Netty,需要的朋友可以參考下2021-06-06
MongoDB整合Spring實(shí)例詳細(xì)講解(含代碼)
這篇文章主要介紹了MongoDB整合Spring實(shí)例詳細(xì)講解(含代碼),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01
Java回調(diào)函數(shù)原理實(shí)例與代理模式的區(qū)別講解
今天小編就為大家分享一篇關(guān)于Java回調(diào)函數(shù)原理實(shí)例與代理模式的區(qū)別講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-02-02
Java中if語句return用法和有無括號(hào)的區(qū)別
本文主要介紹了Java中if語句return用法和有無括號(hào)的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
Mybatis查詢時(shí)數(shù)據(jù)丟失的問題及解決
Mybatis查詢時(shí)數(shù)據(jù)丟失的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解
這篇文章主要介紹了JAVA實(shí)現(xiàn)基于皮爾遜相關(guān)系數(shù)的相似度詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11

