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的自动加载。

四、自定义starter

写一个starter工程模块,里面写上自定义的配置类,配置类里面去设置我们要加载哪些Bean,还是通过@Conditional去过滤,然后在需要使用的地方引入就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值