springboot自动装配

自动装配是通过@EnableAutoConfiguration注解开启的,这个注解在启动类注解@SpringBootApplication内

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration
进入@EnableAutoConfiguration注解 看到有@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
其中@AutoConfigurationPackage作用是把该类所在的包及子包下的所有组件扫描到ioc容器中
AutoConfigurationImportSelector实现了ImportSelector,通过selectImports返回一个String数组,这个数组可以指定需要装配到IOC容器的类,与@Cofiguration不同的是AutoConfigurationImportSelector可以实现批量装载

DEMO:
定义对象

public class FirstClass {

    private String rtn;

    public String getRtn() {
        return rtn;
    }

    public void setRtn(String rtn) {
        this.rtn = rtn;
    }

定义MySelector

public class MySelector  implements ImportSelector {

    @Override
    public String[] selectImports(AnnotationMetadata annotationMetadata) {
        return new String[]{FirstClass.class.getName(),SenondClass.class.getName()};
    }

定义AutoConfig模拟EnableAutoConfiguration

@AutoConfigurationPackage
@Retention(RetentionPolicy.RUNTIME)
@Import(MySelector.class)
public @interface MyAtuoConfig {
}

定义启动类并使用MyAtuoConfig 即可获取bean

@SpringBootApplication
@MyAtuoConfig
public class Application {
    public static void main(String[] args) {
        ConfigurableApplicationContext context= SpringApplication.run(Application.class,args);
        FirstClass firstClass=context.getBean(FirstClass.class);

原理分析
AutoConfigurationImportSelector类

 public String[] selectImports(AnnotationMetadata annotationMetadata) {
        if (!this.isEnabled(annotationMetadata)) {
            return NO_IMPORTS;
        } else {
            AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(this.beanClassLoader);
            AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
            return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
        }
    }

核心过程
1.通过@Import(AutoConfigurationImportSelector)实现配置类的导入
2.AutoConfigurationImportSelector重写selectImorts用于选择性批量配置类的装配
3.通过spring提供的SpringFactoriesLoader机制,扫描classpath路径下的META-INF/spirng.factories,读取需要实现的及自动装配的配置类
4.通过条件筛选的方式,把不符合条件的配置类移除,最终完成自动装配

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值