理念:约定优先配置
简洁的Spring IoC(Inversion Of Control)
IoC.png经常遇到的“context.getBean(..);”的代码做的就是DL的工作,之后的DI工作就是讲之前获取到的Bean按照约定的逻辑联系起来,即一共2个阶段:
1.搜集和注册
2.分析和组装
SpringBoot应用的启动类:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class);
}
}
拥有“三体”结构的@SpringBootApplication
查看源码:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
···
}
1.@Configuration
JavaConfig形式的IoC容器配置类,可以将上诉启动类拆分成两个独立的Java类
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class DemoConfiguration{
@Bean
public Controller controller(){
return new Controller();
}
}
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
2.@EnableAutoConfiguration
借助@Import将JVM相关的bean定义加载到IoC容器,其实是一个复合的Annotation,其定义的关键信息如下:
@SuppressWarnings("deprecation")
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
...
}
其中, @Import(EnableAutoConfigurationImportSelector.class)将所有符合条件的@Configuration配置都加载到当前创建的IoC容器中,其中,“智能”配置的关键是SpringFactoriesLoader类。其核心作用机理是从classpath中搜寻所有的META-INF/spring.factories配置文件,通过反射的方式实例化有@Configuration标注的JavaConfig形式的IoC容器配置类,然后汇总到IoC容器中。
3.@ComponentScan
这个是可有可无的,作用是批量自动扫描。
SpringBoot程序启动的流程:
SpringBoot.png再谈自动配置
基于条件的自动配置
@Configuration / @Bean + @Conditional
最终实现的效果类似如下伪代码:
if(符合@Conditional规定的条件){
加载当前配置(enable current Configuration)或者注册当前Bean定义;
}
所谓基于条件的配置,就是通过@Conditional指定自己的Conditional实现类就可以了:
@Conditional({MyCondition1.class,MyCondition2.class,...})
所谓的“智能”自动配置,是@Conditional可以作为一个Meta Annotation用来标注其它的Annotation实现类,从而构建复合的Annotation,然后再结合@EnableAutoConfiguration就可以实现自动配置了。
SpringBoot的autoconfiguration模块就是基于这一优良的传统。
调整自动配置的顺序
@AutoConfigureBefore
@AutoConfigureAfter
使用上面的2个标签可以让当前配置或者组件按照我们期望的顺序进行。
程序媛小白一枚,如有错误,烦请批评指正!(#.#)
网友评论