1. 程式人生 > >spring @Enable 模組驅動

spring @Enable 模組驅動

@Enable...

基於spring 3.1

@Enable...系列可以實現按需載入整個模組,從而達到簡化配置的目的。我們以@EnableCaching為例子

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({CachingConfigurationSelector.class})
public @interface EnableCaching {
    boolean proxyTargetClass() default false;

    AdviceMode mode() default AdviceMode.PROXY;

    int order() default 2147483647;
}

所以魔法就在 @Import這裡,@Import可以匯入Configuration class, ImportSelector,ImportBeanDefinationRegister的實現類,至少申明一個@Bean方法的類,並將它們註冊為bean。

Configuration Import方式

在上一篇中<context:component-scan/>會將需要spring 註冊的bean定義為BeanDefination。然後交由不同的bean. parser.

spring3. 之後由ConfigurationClassPostProcessor 來處理@Configuration @Bean and @Component. 其中 ConfigurationClassParser.processConfigurationClass(ConfigurationClass)

處理了@Import 相關注解

// 載入註解對應的處理器
<context:annotation-config/>
<context:component-scan base-package="com.xxx"/>

ImportSelector 和 ImportBeanDefinitionRegistrar 方式

這兩種方式可以做更多的自定義操作。

總結

所以在spring framework時代,@Component ,@Configuration 需要被裝載時,應用需要藉助@Import 或者@ComponentScan 的能力, 也是我們通常需要通過@ComponentScan 掃描對應預設的包路徑。

這樣存在的問題:

  1. 會掃描所有的jar包
  2. 在裝配一些複雜Bean的時候,無能為力。

所以催生出了spring b