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