成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring源起【后置處理器BeanPostProcessor的簡單使用和介紹】

DTeam / 1690人閱讀

摘要:官方定義為工廠鉤子,我們也俗稱后置處理器。應(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

相關(guān)文章

  • Spring源碼原理篇(一)

    摘要:也是屬于方法調(diào)用棧的一環(huán),進去有類似一段偽代碼這段代碼通過遍歷得到所有的,然后挨個執(zhí)行重寫的方法,倘若有一個方法返回的為,那么循環(huán)就會跳出,意味著下面的方法不會被執(zhí)行。 Spring源碼原理篇--容器初始化&Bean后置處理器 本篇主要是講解IOC容器初始化過程中大體進行了哪一些工作,以及Bean后置處理器的工作原理和BeanPostProcessor在底層的使用。 環(huán)境準備 編譯器...

    Acceml 評論0 收藏0
  • Spring源碼分析:BeanPostProcessor原理

    摘要:即,的后置處理器,它的作用就是在的初始化方法前跟后進行攔截處理。如何注冊后置處理器我們暫不作分析,著重說一下,后置處理器是如何工作的。 BeanPostProcessor即,Bean的后置處理器,它的作用就是在Bean的初始化方法前跟后進行攔截處理。我們都知道,要想在Bean的初始化方法前后進行工作,那必須在Bean實例創(chuàng)建完成之后,init方法執(zhí)行之前,后置處理器就已經(jīng)在容器中了,所...

    jackwang 評論0 收藏0
  • Spring bean生命流程

    摘要:如果依賴靠構(gòu)造器方式注入,則無法處理,直接會報循環(huán)依賴異常。光繼承這個接口還不夠,繼承這個接口只能獲取,要想讓生效,還需要拿到切面對象包含和才行。有了目標對象,所有的切面類,此時就可以為生成代理對象了。 Spring 是一個輕量級的 J2EE 開源框架,其目標是降低企業(yè)級應(yīng)用開發(fā)難度,提高企業(yè)級應(yīng)用開發(fā)效率。在日程開發(fā)中,我們會經(jīng)常使用 Spring 框架去構(gòu)建應(yīng)用。所以作為一個經(jīng)常使...

    趙連江 評論0 收藏0
  • Spring IOC 容器源碼分析 - 創(chuàng)建單例 bean 過程

    摘要:關(guān)于創(chuàng)建實例的過程,我將會分幾篇文章進行分析。源碼分析創(chuàng)建實例的入口在正式分析方法前,我們先來看看方法是在哪里被調(diào)用的。時,表明方法不存在,此時拋出異常。該變量用于表示是否提前暴露單例,用于解決循環(huán)依賴。 1. 簡介 在上一篇文章中,我比較詳細的分析了獲取 bean 的方法,也就是getBean(String)的實現(xiàn)邏輯。對于已實例化好的單例 bean,getBean(String) ...

    mochixuan 評論0 收藏0
  • Spring注解專題系類(二)

    摘要:的在單例被破壞時由進行方法調(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源碼跟進。本文...

    Alex 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<