首頁 > 軟體

Java中Spring擴充套件點詳解

2022-06-16 10:00:46

如何在所有Bean建立完後做擴充套件

方式一

Spring在容器重新整理完成後會註冊ContextRefreshedEvent。

所以可以自定義事件監聽器監聽該事件進行擴充套件。

監聽器實現:

@Component
public class ContextRefreshedEventListener implements ApplicationListener<ContextRefreshedEvent> {
    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
        System.out.println("容器初始化完成,開始進行擴充套件!");
    }
}

方式二

Spring在所有bean註冊完成後,會檢查bean是否實現了SmartInitializingSingleton介面,如果實現了,會回撥改類的afterSingletonsInstantiated()方法,我們可以在方法裡實現擴充套件。

實現SmartInitializingSingleton介面:

/**
 * @author zhw
 * @description
 * @date 2021-09-29 15:28
 */
@Component
public class SmartInitializingSingletonTest implements SmartInitializingSingleton {
    @Override
    public void afterSingletonsInstantiated() {
        System.out.println("所有單例bean註冊完成,開始擴充套件!");
    }
}

Spring通過initPropertySources擴充套件方法設定環境設定

Spring的prepareRefresh()方法中有initPropertySources()方法,但是預設容器是未實現這個方法的。我們可以實現該方法進行擴充套件。

實現自定義擴充套件容器:

/**
 * @author zhw
 * @description
 * @date 2021-09-29 16:05
 */
public class ExtensionContext extends AnnotationConfigApplicationContext {
    public ExtensionContext(Class<MainConfig> mainConfigClass) {
        super(mainConfigClass);
    }
    @Override
    protected void initPropertySources() {
        //設定一些必須的環境變數
        getEnvironment().setRequiredProperties("appName");
    }
}

設定環境變數:

測試類:

public class MyContextTest {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext annotationConfigApplicationContext = new ExtensionContext(MainConfig.class);
    }
}

結果:

@Import進行擴充套件

方式一:實現ImportBeanDefinitionRegistrar介面

例如開啟AOP註解,使用AspectJAutoProxyRegistrar.class

AspectJAutoProxyRegistrar實現了ImportBeanDefinitionRegistrar介面,進行BeadDefinition的註冊:

方式二:實現ImportSelector介面

ImportSelector介面的selectImports方法返回的是要注入類的全類名陣列。spring會根據全類名註冊bean。

例如:開啟事務管理功能就是使用實現ImportSelector介面進行擴充套件。

看下TransactionManagementConfigurationSelector.class:

到此這篇關於Java中Spring擴充套件點詳解的文章就介紹到這了,更多相關Java Spring擴充套件點內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com