用了这么久的 SpringBoot ,我们再来回顾一下它,本文介绍 Spring Boot 的自动配置,这是它区别于 Spring 的最大的点,本文的自动配置项目包含三个项目,建议拉取仓库里的代码进行实践:尹煜 / AutoConfigDemo · GitCode
目录
1 介绍
2 自动配置原理
2.1 启动类注解
① @SpringBootApplication
② @SpringBootConfiguration
② @EnableAutoConfiguration
③ @ComponentScan(包扫描)
2.2 条件类注解
① 类条件
② 属性条件
③ Bean 条件
④ 资源条件
⑤ Web 应用条件
⑥ 其他条件
3 手动实现自动配置
3.1 资源配置
3.2 项目代码展示
① 主项目(autoconfigure-demo)
② 副项目(geektime-spring-boot-autoconfigure)
③ 副项目(greeting)
3.3 自动/手动配置实现
① 自动配置
② 手动配置
③ 关闭配置
Spring Boot 目的在于简化 Spring 繁琐的 XML 配置,本质依然还是Spring框架,使用 Spring Boot后可不再使用任何 XML 配置来启动一个服务,使得使用微服务架构时可以更加快速的建立一个应用。
Spring Boot 特点:
首先引用一张 Spring Boot 的自动配置原理流程图 👇
这是 Spring Boot 启动类的注解,也是自动配置的开始 👇
@SpringBootApplication
public class SpringbootWorkApplication {public static void main(String[] args) {SpringApplication.run(SpringbootWorkApplication.class, args);}
}
@SpringBootApplication 用于标注在 SpringBoot 的主配置类上,也就是说项目应该运行该类的 main 方法来启动 SpringBoot 项目;其本质是一个组合注解,进入该注释的代码 👇
@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 {
查看该类的元信息,其实主要包含以下注解:
查看一下它的源码 👇
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}
顾名思义,该注释含义是启动自动配置~
查看它的源码:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage //自动导包
@Import({AutoConfigurationImportSelector.class}) //自动配置导入选择
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class>[] exclude() default {};String[] excludeName() default {};
}
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,JdbcTemplateAutoConfiguration.class})
public class DataSourceDemoApplication implements CommandLineRunner {public static void main(String[] args) {SpringApplication.run(DataSourceDemoApplication.class, args);}
}
@Conditional :所有注解都基于它,是spring4引入的注解
后边的项目也将使用条件类注释来测试自动配置和手动配置~
以下资源来自《玩转 Spring 全家桶》课程,项目源码:尹煜 / AutoConfigDemo · GitCode
首先需要将三个项目通过 IDEA 合并在一起,主项目是 autoconfigure-demo:
首先通过 IDEA 打开主项目,然后按照下述流程逐一导入两外两个项目即可 👇
项目源码:尹煜 / AutoConfigDemo · GitCode
因涉及到三个项目,且彼此呈依赖关系,因此会有点难以理解,本文希望尽可能讲得清楚一些~
路径:geektime/spring/hello/AutoconfigureDemoApplication.java
@SpringBootApplication
public class AutoconfigureDemoApplication {public static void main(String[] args) {SpringApplication.run(AutoconfigureDemoApplication.class, args);}// @Bean
// public GreetingApplicationRunner greetingApplicationRunner() {
// return new GreetingApplicationRunner("Spring!");
// }
}
路径:src/main/resources/application.properties
greeting.enabled=true 用于搭配 @ConditionalOnProperty 的条件判断,见于第2个项目的启动类
greeting.enabled=true
路径:autoconfigure-demo\pom.xml
org.springframework.boot spring-boot-starter-parent 2.1.3.RELEASE geektime.spring.hello autoconfigure-demo 0.0.1-SNAPSHOT autoconfigure-demo Demo project for Spring Boot org.springframework.boot spring-boot-starter geektime.spring.hello geektime-spring-boot-autoconfigure 0.0.1-SNAPSHOT geektime.spring.hello greeting 0.0.1-SNAPSHOT org.springframework.boot spring-boot-starter-test test
路径:geektime/spring/hello/greeting/GreetingAutoConfiguration.java
@Configuration
@ConditionalOnClass(GreetingApplicationRunner.class)//当classpath中 存在GreetingApplicationRunner时 才能生效
public class GreetingAutoConfiguration {@Bean@ConditionalOnMissingBean(GreetingApplicationRunner.class)//不存在GreetingApplicationRunner这个类型的bean的时候,才能生效@ConditionalOnProperty(name = "greeting.enabled", havingValue = "true", matchIfMissing = true)//greeting.enabled这个属性为true 才能执行,如果没有配置这个值,就默认值为truepublic GreetingApplicationRunner greetingApplicationRunner() {return new GreetingApplicationRunner();}
}
路径:src/main/resources/META-INF/spring.factories
模拟 Spring Boot 的自动配置(自动配置时,Spring Boot 会扫描到类路径下的META-INF/spring.factories 配置文件,把 EnableAutoConfiguration 对应的的 Bean 值添加到容器中)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
geektime.spring.hello.greeting.GreetingAutoConfiguration
路径:geektime-spring-boot-autoconfigure\pom.xml
该副项目也依赖 greeting 项目
org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.springframework.boot spring-boot-autoconfigure geektime.spring.hello greeting 0.0.1-SNAPSHOT provided
路径:geektime/spring/hello/greeting/GreetingApplicationRunner.java
用于检验自动配置成果!
@Slf4j
public class GreetingApplicationRunner implements ApplicationRunner {private String name;public GreetingApplicationRunner(){this("OK!");}public GreetingApplicationRunner(String name) {this.name = name;log.info("Initializing GreetingApplicationRunner.{}",name);}public void run(ApplicationArguments args) throws Exception {log.info("Hello everyone! We all like Spring! ");}
}
路径:greeting\pom.xml
org.springframework.boot spring-boot-dependencies ${spring-boot.version} pom import org.springframework.boot spring-boot org.projectlombok lombok true org.slf4j slf4j-api
以上,所有文件展示完毕~
Ⅰ 注解主项目(autoconfigure-demo)中 AutoconfigureDemoApplication 启动类中的 bean
Ⅱ application.properties 中 greeting.enabled=true
启动主项目的启动类,日志输出显示自动配置成功,使用的是使用空参构造的配置--自动配置 👇
Ⅰ 启动主项目(autoconfigure-demo)中 AutoconfigureDemoApplication 启动类中的 bean 👇
Ⅱ application.properties 中 greeting.enabled=true
启动主项目的启动类,日志输出显示手动配置成功,使用的是有参构造--手动配置 👇
Ⅰ 注解主项目(autoconfigure-demo)中 AutoconfigureDemoApplication 启动类中的 bean
Ⅱ application.properties 中 greeting.enabled=false
启动主项目的启动类,日志输出显示该 bean 未被创建--关闭配置 👇
SpringBoot自动配置原理_程序员老石的博客-CSDN博客_springboot自动配置原理
动手实现自己的自动配置_L# S@的博客-CSDN博客