1. 程式人生 > >如何精準控制Spring ApplicationContext的掃描範圍

如何精準控制Spring ApplicationContext的掃描範圍

在Spring中,掃描的方式一是基於XML,二是基於Annotation,它們既可以混合使用,又可以隔離使用,但在技術框架的使用中,需要精準地控制它們的掃描範圍,一方面可以避免重複註冊,另一方面可以避免漏掉核心的服務Bean。

更重要的是,在諸如事務控制的場景中,精準地控制ApplicationContext的掃描一方面可以提高系統性能,加快程式啟動速度,另一方面可以避免操作範圍混淆,尤其是在Spring 3及之前的版本,必須隔離Web ApplicationContext與Root ApplicationContext,否則事務將無法成功。

下面以XML為例,控制Controller的掃描範圍

<context:component-scan base-package="com.stixu" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>  
    <context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"
/>
</context:component-scan>

上面的程式碼片段將ApplicationContext掃描範圍侷限在Controller與RestController上,需要注意的是,即使此時系統中有@Configuration的類,其定義的@Bean也無法啟用。

如果要啟用@Configuration,需要在配置中新增如下片段:

<context:component-scan base-package="com.stixu" use-default-filters="false">
    <context:include-filter
type="annotation" expression="org.springframework.stereotype.Controller"/>
<context:include-filter type="annotation" expression="org.springframework.web.bind.annotation.RestController"/> <!-- 啟用@Configuration --> <context:include-filter type="annotation" expression="org.springframework.context.annotation.Configuration"/> </context:component-scan>

而在@Configuration中啟用XML配置,就太簡單了,程式碼如下:

//  基於Annotation的配置
@Configuration
//  XML中的Bean將自動啟用
@ImportResource({"classpath:/META-INF/springContext/mvc-context.xml",
         "classpath:/META-INF/springContext/booter-context.xml"
        })
public class AppConfig {

}

結論

精準控制Spring ApplicationContext的掃描範圍可以提高程式的效能,其關鍵配置是context:include-filter,但要注意,別忽略了@Configuration與XML配置的差異與聯絡。