SpringBoot中@EnableAutoConfiguration注解的做用

wKiom1nXS5iAI_TDAACihSWnjr0248.png

在这个注解中,最重要的是它导入了一个类EnableAutoConfigurationImportSelectorspring

它是一个ImportSelector接口的实现类,而ImportSelector接口中的selectImports方法所返回的类将数组

被Spring容器管理起来。ide

wKioL1nXTH-yo-7TAAFDIsA5hJg724.png


再看AutoConfigurationImportSelector类,它不光实现了ImportSelector接口,还实现了不少其它的Aware接口,分别表示在某个时机会被回调,咱们看一下Aware接口就知道了。spa

wKioL1nXTUmz4ILZAACDqpWOyFE290.png


wKioL1nXTXSj9_1QAACp2MWZ7dI249.png

咱们能够知道,全部的aware都优先于selectImports方法执行,也就是说selectImports方法最后执行,那么在它执行的时候全部须要的资源都已经获取到了(就是那四个成员变量)orm

那咱们看看selectImports都干了什么blog

wKioL1nXTj_yjm4oAACWnR3sE4Y296.png

看图说话:排序

一、加载META-INF/spring-autoconfigure-metadata.properties文件接口

二、获取注解的属性及其值(PS:注解指的是@EnableAutoConfiguration注解)资源

三、在classpath下全部的META-INF/spring.factories文件中查找org.springframework.boot.autoconfigure.EnableAutoConfiguration的值,并将其封装到一个List中返回get

四、对上一步返回的List中的元素去重、排序

五、依据第2步中获取的属性值排除一些特定的类

六、对上一步中所获得的List进行过滤,过滤的依据是条件匹配。这里用到的过滤器是org.springframework.boot.autoconfigure.condition.OnClassCondition最终返回的是一个ConditionOutcome[]数组。(PS:不少类都是依赖于其它的类的,当有某个类时才会装配,因此此次过滤的就是根据是否有某个class进而决定是否装配的。这些类所依赖的类都写在META-INF/spring-autoconfigure-metadata.properties文件里


wKiom1nXXbWh1IlFAAEnxus6kvs830.png

wKiom1nXXVbTRmtDAAChrIH8o4Y208.png

wKioL1nXXQmCPO6cAACW6iTt4Pc315.png

wKioL1nXXQrj4tWuAAGJE9YaRxg099.png



wKiom1nXXhLw5gXuAAC6XBizfiI334.png

相关文章
相关标签/搜索