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