摘要:官方定義為工廠鉤子,我們也俗稱后置處理器。應(yīng)用程序上下文可以在其定義中自動檢測,并將它們應(yīng)用于隨后創(chuàng)建的任何。我們使用來啟動容器。至于具體的實際使用案例,將在下一篇文章中講解
BeanPostProcessor官方定義為工廠鉤子,我們也俗稱后置處理器。它允許自定義修改新的bean實例,例如檢查標記接口或用代理包裝它們。應(yīng)用程序上下文可以在其bean定義中自動檢測BeanPostProcessor bean,并將它們應(yīng)用于隨后創(chuàng)建的任何bean。
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; } }
既然是接口,那么我們要使用它就必須實現(xiàn)它,我們創(chuàng)建一個SimpleBeanPostProcessor類來實現(xiàn)該接口
@Component public class SimpleBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization - " + bean.getClass().getName() + " - " + beanName); return null; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization - " + bean.getClass().getName() + " - " + beanName); return null; } }
我們在實現(xiàn)類中只是簡單的打印下bean的信息以及beanName
想要后置處理器起作用,那就必須啟動spring容器。我們使用AnnotationConfigApplicationContext來啟動spring容器。并且在spring中注入一個自定義Bean
@ComponentScan("spring.postProcessor") @Configuration("spring.postProcessor.run") public class Run { public static void main(String[] args) { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(Run.class); applicationContext.close(); } /** * 通過@Bean的方式可以指定initMethod * @return */ @Bean(initMethod = "init") public MyBean myBean() { return new MyBean(); } }
MyBean代碼如下
@Data public class MyBean { private String beanName; private String className; public MyBean() { System.out.println("MyBean constructor"); } public void init() { System.out.println("MyBean is init"); } }
運行后結(jié)果如下
postProcessBeforeInitialization - spring.postProcessor.Run$$EnhancerBySpringCGLIB$$db1dd68 - spring.postProcessor.run postProcessAfterInitialization - spring.postProcessor.Run$$EnhancerBySpringCGLIB$$db1dd68 - spring.postProcessor.run MyBean constructor postProcessBeforeInitialization - spring.postProcessor.MyBean - myBean MyBean is init postProcessAfterInitialization - spring.postProcessor.MyBean - myBean
從打打印結(jié)果可以看出,后置處理器在bean的構(gòu)造方法執(zhí)行之后執(zhí)行。而且后置處理器的方法postProcessBeforeInitialization和postProcessAfterInitialization分別在Bean的init方法前后執(zhí)行。并且后置處理器會對spring中所有的bean起作用。
在spring源碼類org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory的方法initializeBean中,我們可以看到為什么會這樣執(zhí)行。
以上就是spring的后置處理器的簡單的使用方法以及執(zhí)行時機。至于具體的實際使用案例,將在下一篇文章中講解!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/75655.html
摘要:也是屬于方法調(diào)用棧的一環(huán),進去有類似一段偽代碼這段代碼通過遍歷得到所有的,然后挨個執(zhí)行重寫的方法,倘若有一個方法返回的為,那么循環(huán)就會跳出,意味著下面的方法不會被執(zhí)行。 Spring源碼原理篇--容器初始化&Bean后置處理器 本篇主要是講解IOC容器初始化過程中大體進行了哪一些工作,以及Bean后置處理器的工作原理和BeanPostProcessor在底層的使用。 環(huán)境準備 編譯器...
摘要:即,的后置處理器,它的作用就是在的初始化方法前跟后進行攔截處理。如何注冊后置處理器我們暫不作分析,著重說一下,后置處理器是如何工作的。 BeanPostProcessor即,Bean的后置處理器,它的作用就是在Bean的初始化方法前跟后進行攔截處理。我們都知道,要想在Bean的初始化方法前后進行工作,那必須在Bean實例創(chuàng)建完成之后,init方法執(zhí)行之前,后置處理器就已經(jīng)在容器中了,所...
摘要:如果依賴靠構(gòu)造器方式注入,則無法處理,直接會報循環(huán)依賴異常。光繼承這個接口還不夠,繼承這個接口只能獲取,要想讓生效,還需要拿到切面對象包含和才行。有了目標對象,所有的切面類,此時就可以為生成代理對象了。 Spring 是一個輕量級的 J2EE 開源框架,其目標是降低企業(yè)級應(yīng)用開發(fā)難度,提高企業(yè)級應(yīng)用開發(fā)效率。在日程開發(fā)中,我們會經(jīng)常使用 Spring 框架去構(gòu)建應(yīng)用。所以作為一個經(jīng)常使...
摘要:關(guān)于創(chuàng)建實例的過程,我將會分幾篇文章進行分析。源碼分析創(chuàng)建實例的入口在正式分析方法前,我們先來看看方法是在哪里被調(diào)用的。時,表明方法不存在,此時拋出異常。該變量用于表示是否提前暴露單例,用于解決循環(huán)依賴。 1. 簡介 在上一篇文章中,我比較詳細的分析了獲取 bean 的方法,也就是getBean(String)的實現(xiàn)邏輯。對于已實例化好的單例 bean,getBean(String) ...
摘要:的在單例被破壞時由進行方法調(diào)用。定義并實現(xiàn)這兩個接口容器創(chuàng)建完成注解是的縮寫,意思是規(guī)范提案。在創(chuàng)建完成并且屬性賦值完成來執(zhí)行初始化方法在容器銷毀之前回調(diào)通知支持自動裝配,類似。 Spring注解應(yīng)用篇--IOC容器Bean生命周期 這是Spring注解專題系類文章,本系類文章適合Spring入門者或者原理入門者,小編會在本系類文章下進行企業(yè)級應(yīng)用實戰(zhàn)講解以及spring源碼跟進。本文...
閱讀 1648·2023-04-25 20:36
閱讀 2069·2021-09-02 15:11
閱讀 1209·2021-08-27 13:13
閱讀 2661·2019-08-30 15:52
閱讀 4710·2019-08-29 17:13
閱讀 1010·2019-08-29 11:09
閱讀 1499·2019-08-26 11:51
閱讀 847·2019-08-26 10:56