註解使用
@SpringBootApplication
@AutoConfigurationImportSelector
方法 selectImports
-
加載元數據
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應用程序 -
對一些需要加載的類做處理
-
從
META-INF/spring.factories
加載配置的類 -
去掉重複的
-
過濾掉配置過exclustion的類
-
加載合適的配置類
-
自定義實現自動裝配
方式1 :
-
編寫配置註解
@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage @Import({AutoImportSelector.class}) // 自定義加載類 public @interface DefaultAutoConfig {
-
實現
DeferredImportSelector
接口並且創建 類AutoImportSelector
import org.springframework.context.annotation.DeferredImportSelector; import org.springframework.core.type.AnnotationMetadata; public class AutoImportSelector implements DeferredImportSelector {
-
·
AutoImportSelector
類中編寫方法public String[] selectImports(AnnotationMetadata annotationMetadata) { // ...對註解的元信息 進行處理 // 過濾需要移除的類 // 對需要加載的類進行個性化操作 return new String[]{UserService.class.getName()}; }
方式2:通過配置文件
-
創建
META-INF/spring.factories
,加上自定義的配置類org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.wl.core.CoreConfig
-
在
CoreConfig
配置需要的配置信息@Configurable public class CoreConfig { @Bean public Core core(){ return new Core(); } }
方式3 :通過ImportBeanDefinitionRegistrar
接口
-
只要把
方式1
的importAutoImportSelector
換成ImportBeanDefinitionRegistrar
實現類 就可以了@Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @AutoConfigurationPackage //@Import({AutoImportSelector.class}) @Import({ImportConfig.class}) public @interface DefaultAutoConfig {
-
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); } }