如何精準控制Spring ApplicationContext的掃描範圍
阿新 • • 發佈:2019-02-08
在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配置的差異與聯絡。