SpringBoot自动配置

一、Condition

通过实现Condition接口去完成有条件的加载相应的Bean

二、Enable注解原理

SpringBoot不能直接获取在其他工程中定义的Bean

原因:@ComponentScan默认扫描范围:当前引导类所在包及其子包

有三种解决方案:

1.使用@ComponentScan扫描需要注入的包 
  
2.可以使用@Import注解,加载类。这些类都会被Spring创建,并放入IOC容器
  
3.可以对Import注解进行封装,形成Enable注解。

@Enable*  底层依赖于@Import注解导入一些类。

@Import4种用法:

(1)导入Bean——@Import(User.class)

(2)导入配置类——@Import(UserConfig.class)

(3)导入 ImportSelector 实现类 @Import(MyImportSelector.class)

public class MyImportSelector implements ImportSelector {
      @Override
      public String[] selectImports(AnnotationMetadata importingClassMetadata) {
          return new String[]{"com.itheima.domain.User", "com.itheima.domain.Role"};
      }
}

(4)导入 ImportBeanDefinitionRegistrar 实现@Import({MyImportBeanDefinitionRegistrar.class})

public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
      @Override
      public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,     
          BeanDefinitionRegistry registry) {
             AbstractBeanDefinition beanDefinition = 
              BeanDefinitionBuilder.rootBeanDefinition(User.class).getBeanDefinition();
             registry.registerBeanDefinition("user", beanDefinition);
      }
}

三、自动配置原理

自动配置的注解是@EnableAutoConfiguration,是通过ImportSelector的一个实现类AutoConfigurationImportSelector作用就是收集需要导入的配置类,获取注入类的方法是 selectImports(),它实际调用的是getAutoConfigurationEntry,去获取所有需要自动装配的配置类的路径(从META-INF/spring.factories 获取自动配置类的路径),在配置类里面使用@Conditional来过滤不需要加载的Bean,从而实现需要的Bean的自动加载。

你可能感兴趣的:(SpringBoot,Java,spring,boot,java,spring)