Spring boot 的自動裝配

註解使用

@SpringBootApplication

@AutoConfigurationImportSelector

​ 方法 selectImports

  1. 加載元數據 META-INF/spring-autoconfigure-metadata.properties(一些判斷條件)

    配置文件

    ConditionalOnClass 當類存在的時候

    ConditionalOnBean 當bean必須存在時候

    AutoConfigureBefore加載類之前做的時候

    AutoConfigureAfter 加載類之後做的時候

    AutoConfigureOrder 加載的順序

    註解

    Conditions 描述
    @ConditionalOnBean 在存在某個bean的時候
    @ConditionalOnMissingBean 不存在某個bean的時候
    @ConditionalOnClass 當前classpath可以找到某個類型的類時候
    @ConditionalOnMissingClass 當前classpath不可以找到某個類型的類時
    @ConditionalOnResource 當前classpath是否存在某個資源文件
    @ConditionalOnProperty 當前jvm是否包含某個系統屬性爲某個值
    @ConditionalOnWebApplication 當前spring context是否是web應用程序
  2. 對一些需要加載的類做處理

    1. META-INF/spring.factories加載配置的類

    2. 去掉重複的

    3. 過濾掉配置過exclustion的類

    4. 加載合適的配置類

自定義實現自動裝配

方式1 :

  1. 編寫配置註解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    @Import({AutoImportSelector.class}) // 自定義加載類
    public @interface DefaultAutoConfig {
    
  2. 實現DeferredImportSelector 接口並且創建 類AutoImportSelector

    import org.springframework.context.annotation.DeferredImportSelector;
    import org.springframework.core.type.AnnotationMetadata;
    
    public class AutoImportSelector implements DeferredImportSelector {
    
  3. ·AutoImportSelector 類中編寫方法

     public String[] selectImports(AnnotationMetadata annotationMetadata) {
         	// ...對註解的元信息 進行處理
         	// 過濾需要移除的類
         	// 對需要加載的類進行個性化操作
            return new String[]{UserService.class.getName()};
        }
    

方式2:通過配置文件

  1. 創建META-INF/spring.factories ,加上自定義的配置類

    org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wl.core.CoreConfig
    
  2. CoreConfig 配置需要的配置信息

    @Configurable
    public class CoreConfig {
    
        @Bean
        public Core core(){
            return new Core();
        }
    }
    

方式3 :通過ImportBeanDefinitionRegistrar 接口

  1. 只要把方式1 的importAutoImportSelector 換成 ImportBeanDefinitionRegistrar 實現類 就可以了

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @AutoConfigurationPackage
    //@Import({AutoImportSelector.class})
    @Import({ImportConfig.class})
    public @interface DefaultAutoConfig {
    
  2. ImportBeanDefinitionRegistrar 處理

    public class ImportConfig implements ImportBeanDefinitionRegistrar {
        @Override
        public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) {
            UserService userService = new UserService();
    
            RootBeanDefinition rootBeanDefinition = new RootBeanDefinition(UserService.class);
    
            String className = StringUtils.uncapitalize(UserService.class.getSimpleName());
            beanDefinitionRegistry.registerBeanDefinition(className, rootBeanDefinition);
        }
    }
    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章