欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring高級接口Aware淺析

 更新時間:2023年01月30日 08:44:54   作者:靖康之恥  
通過aware接口可以獲取Spring容器相關(guān)信息,但這樣會與Spring容器耦合,這篇文章主要介紹了Spring aware接口理解,需要的朋友可以參考下

Aware 接口功能闡述

Aware 接口提供了一種【內(nèi)置】 的注入手段,例如

a.BeanNameAware 注入 bean 的名字

b.BeanFactoryAware 注入 BeanFactory 容器

c.ApplicationContextAware 注入 ApplicationContext 容器

d.EmbeddedValueResolverAware 注入 ${} 解析器

功能案例演示

public class MyBean implements BeanNameAware, ApplicationContextAware, InitializingBean {
    private static final Logger log = LoggerFactory.getLogger(MyBean.class);
    @Override
    public void setBeanName(String name) {
        log.debug("當(dāng)前bean " + this + " 名字叫:" + name);
    }
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        log.debug("當(dāng)前bean " + this + " 容器是:" + applicationContext);
    }
    @Override
    public void afterPropertiesSet() throws Exception {
        log.debug("當(dāng)前bean " + this + " 初始化");
    }
    @Autowired
    public void aaa(ApplicationContext applicationContext) {
        log.debug("當(dāng)前bean " + this + " 使用@Autowired 容器是:" + applicationContext);
    }
    @PostConstruct
    public void init() {
        log.debug("當(dāng)前bean " + this + " 使用@PostConstruct 初始化");
    }
}

測試:

  GenericApplicationContext context = new GenericApplicationContext();   
  context.registerBean("myBean", MyBean.class);
  context.refresh(); 
  context.close();

可能這里有人會有疑問: b、c、d 的功能用 @Autowired 就能實現(xiàn)啊, 為啥還要用 Aware 接口呢

簡單地說:

a.@Autowired 的解析需要用到 bean 后處理器, 屬于擴(kuò)展功能

b.而 Aware 接口屬于內(nèi)置功能, 不加任何擴(kuò)展, Spring 就能識別

某些情況下, 擴(kuò)展功能會失效, 而內(nèi)置功能不會失效

如下所示:

  @Autowired
    public void aaa(ApplicationContext applicationContext) {
        log.debug("當(dāng)前bean " + this + " 使用@Autowired 容器是:" + applicationContext);
    }
    @PostConstruct
    public void init() {
        log.debug("當(dāng)前bean " + this + " 使用@PostConstruct 初始化");
    }

在這里,你會發(fā)現(xiàn)用 Aware 注入 ApplicationContext 成功, 而 @Autowired 注入 ApplicationContext 失敗

擴(kuò)展功能失效場景分析

@Configuration
public class MyConfig1 {
    private static final Logger log = LoggerFactory.getLogger(MyConfig1.class);
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        log.debug("注入 ApplicationContext");
    }
    @PostConstruct
    public void init() {
        log.debug("初始化");
    }
    @Bean //  beanFactory 后處理器
    public BeanFactoryPostProcessor processor1() {
        return beanFactory -> {
            log.debug("執(zhí)行 processor1");
        };
    }
}
context.refresh(); 

這行代碼的執(zhí)行順序,到容器里找到所有的.beanFactory 后處理器來執(zhí)行,添加 bean 后處理器,初始化單例。

Java 配置類不包含 BeanFactoryPostProcessor 的情況

Java 配置類包含 BeanFactoryPostProcessor 的情況,因此要創(chuàng)建其中的 BeanFactoryPostProcessor 必須提前創(chuàng)建 Java 配置類,而此時的 BeanPostProcessor 還未準(zhǔn)備好,導(dǎo)致 @Autowired 等注解失效

對應(yīng)代碼

@Configuration
public class MyConfig1 {
    private static final Logger log = LoggerFactory.getLogger(MyConfig1.class);
    @Autowired
    public void setApplicationContext(ApplicationContext applicationContext) {
        log.debug("注入 ApplicationContext");
    }
    @PostConstruct
    public void init() {
        log.debug("初始化");
    }
    @Bean //  ?? 注釋或添加 beanFactory 后處理器對應(yīng)上方兩種情況
    public BeanFactoryPostProcessor processor1() {
        return beanFactory -> {
            log.debug("執(zhí)行 processor1");
        };
    }
}

注意

解決方法:

  • 用內(nèi)置依賴注入和初始化取代擴(kuò)展依賴注入和初始化
  • 用靜態(tài)工廠方法代替實例工廠方法,避免工廠對象提前被創(chuàng)建

測試:

 GenericApplicationContext context = new GenericApplicationContext();
 context.registerBean("myConfig2", MyConfig2.class);
 context.registerBean(AutowiredAnnotationBeanPostProcessor.class);
 context.registerBean(CommonAnnotationBeanPostProcessor.class);
 context.registerBean(ConfigurationClassPostProcessor.class);
 context.refresh();
 context.close();

輸出結(jié)果:

總結(jié)

  • Aware 接口提供了一種【內(nèi)置】 的注入手段, 可以注入 BeanFactory, ApplicationContext
  • InitializingBean 接口提供了一種【內(nèi)置】的初始化手段
  • 內(nèi)置的注入和初始化不受擴(kuò)展功能的影響, 總會被執(zhí)行, 因此 Spring 框架內(nèi)部的類常用它們

到此這篇關(guān)于Spring高級接口Aware淺析的文章就介紹到這了,更多相關(guān)Spring Aware內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程阻塞的方法區(qū)別詳解

    Java線程阻塞的方法區(qū)別詳解

    這篇文章主要介紹了Java線程阻塞的方法區(qū)別詳解,線程阻塞是指當(dāng)一個線程無法繼續(xù)執(zhí)行時,它會進(jìn)入阻塞狀態(tài),直到某個條件滿足后才能繼續(xù)執(zhí)行,線程阻塞可以通過多種方式實現(xiàn),如等待鎖、等待IO操作、等待其他線程的完成等,需要的朋友可以參考下
    2023-10-10
  • 詳解SpringMVC學(xué)習(xí)系列之國際化

    詳解SpringMVC學(xué)習(xí)系列之國際化

    這篇文章主要介紹了詳解SpringMVC學(xué)習(xí)系列之國際化,詳細(xì)的介紹了關(guān)于瀏覽器,Session,Cookie,URL請求的國際化的實現(xiàn),有興趣的可以了解一下
    2017-07-07
  • Java 限制子類訪問的方法分析

    Java 限制子類訪問的方法分析

    這篇文章主要介紹了Java 限制子類訪問的方法,結(jié)合實例形式分析了java類的繼承與訪問相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-09-09
  • 線程池運用不當(dāng)引發(fā)的一次線上事故解決記錄分析

    線程池運用不當(dāng)引發(fā)的一次線上事故解決記錄分析

    遇到了一個比較典型的線上問題,剛好和線程池有關(guān),另外涉及到死鎖、jstack命令的使用、JDK不同線程池的適合場景等知識點,同時整個調(diào)查思路可以借鑒,特此記錄和分享一下
    2024-01-01
  • java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理分析

    java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理分析

    這篇文章主要介紹了java內(nèi)存管理關(guān)系及內(nèi)存泄露的原理,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java調(diào)用Oracle存儲過程詳解

    Java調(diào)用Oracle存儲過程詳解

    這篇文章主要介紹了Java調(diào)用Oracle存儲過程詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • 基于SpringBoot?使用?Flink?收發(fā)Kafka消息的示例詳解

    基于SpringBoot?使用?Flink?收發(fā)Kafka消息的示例詳解

    這篇文章主要介紹了基于SpringBoot?使用?Flink?收發(fā)Kafka消息,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-01-01
  • 關(guān)于ArrayList初始化容量的問題

    關(guān)于ArrayList初始化容量的問題

    這篇文章主要介紹了關(guān)于ArrayList初始化容量的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java使用注解實現(xiàn)防止重復(fù)提交實例

    Java使用注解實現(xiàn)防止重復(fù)提交實例

    這篇文章主要介紹了Java使用注解實現(xiàn)防止重復(fù)提交實例,在一些項目中由于用戶誤操作,多次點擊表單提交按鈕,會產(chǎn)生很多次的數(shù)據(jù)交互,為了解決這一問題,本文使用注解來實現(xiàn)防止重復(fù)提交,需要的朋友可以參考下
    2023-07-07
  • Java雙冒號(::)運算符使用詳解

    Java雙冒號(::)運算符使用詳解

    之前沒用過::這個東西,今天看flink的時候發(fā)現(xiàn)官網(wǎng)有個例子用到了這個符號,本文就詳細(xì)的來介紹一下Java雙冒號(::)運算符使用詳解,感興趣的可以了解一下
    2021-09-09

最新評論