关注我
转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/19/SpringBootApplication-annotation/
概述
许多 Spring Boot 开发者喜欢他们的应用程序使用自动配置、组件扫描、并能够在他们的 “Application” 类上定义额外的配置。 可以使用一个 @SpringBootApplication
注解来启用这些功能。
1 | import org.springframework.boot.SpringApplication; |
@SpringBootApplication
跟进去 @SpringBootApplication
注解可以发现下图:
其中标注的三个注解正能解决我们上面所说的三种功能,它们是:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
该接口除了上面三个注解外,还有四个方法如下:
- Class<?>[] exclude() default {}:
根据 class 来排除,排除特定的类加入 spring 容器,传入参数 value 类型是 class 类型。 - String[] excludeName() default {}:
根据 class name 来排除,排除特定的类加入 spring 容器,传入参数 value 类型是 class 的全类名字符串数组。 - String[] scanBasePackages() default {}:
指定扫描包,参数是包名的字符串数组。 - Class<?>[] scanBasePackageClasses() default {}:
扫描特定的包,参数类似是 Class 类型数组。
就拿 scanBasePackages 来举个例子:
1 | "com.zhisheng.controller","com.zhisheng.model"}) (scanBasePackages = { |
将不需要的 bean 排除在 spring 容器中,如何操作?看看官方的代码怎么用的:
@SpringBootConfiguration
@SpringBootConfiguration
继承自@Configuration
,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean
注解标记的方法的实例纳入到srping
容器中,并且实例名就是方法名。
虽说现在已经推荐使用 Spring Boot 里面的 @SpringBootConfiguration
注解,为了探个究竟,我们还是继续研究下 @Configuration
注解。
@Configuration
@Configuration 标注在类上,相当于把该类作为 spring 的 xml 配置文件中的 <beans>
,作用为:配置 spring 容器(应用上下文)
1 | <beans> |
@Bean
@Bean 标注在方法上(返回某个实例的方法),等价于 spring 的 xml 配置文件中的<bean>
,作用为:注册 bean 对象
可以看看这篇文章:https://www.ibm.com/developerworks/cn/webservices/ws-springjava/index.html
@ComponentScan
可以通过该注解指定扫描某些包下包含如下注解的均自动注册为 spring beans:
@Component、@Service、 @Repository、 @Controller、@Entity 等等
例如:
1 | "com.zhisheng.controller","com.zhisheng.model"}) (basePackages = { |
以前是在 xml 配置文件中设置如下标签:<context:component-scan>
(用来扫描包配置)
除了可以使用 @ComponentScan
注解来加载我们的 bean,还可以在 Application 类中使用 @Import
指定该类。
例如:
1 | //直接 imoport 要引入的类 ({ConsulConfig.class, Log4jEndPointConfiguration.class}) |
@EnableAutoConfiguration
@EnableAutoConfiguration
的作用启动自动的配置,@EnableAutoConfiguration
注解的意思就是Springboot
根据你添加的 jar 包来配置你项目的默认配置,比如根据spring-boot-starter-web
,来判断你的项目是否需要添加了webmvc
和tomcat
,就会自动的帮你配置 web 项目中所需要的默认配置。简单点说就是它会根据定义在 classpath 下的类,自动的给你生成一些 Bean,并加载到 Spring 的 Context 中。
可以看到 import 引入了 AutoConfigurationImportSelector 类。该类使用了 Spring Core 包的 SpringFactoriesLoader 类的 loadFactoryNamesof() 方法。
AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口,并实现了 selectImports 方法,用来导出Configuration 类。
1 | List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes); |
导出的类是通过 SpringFactoriesLoader.loadFactoryNames() 读取了 ClassPath 下面的 META-INF/spring.factories 文件。
这个文件内容大致如下。
后面继续会写自动配置方面的博客,请继续关注!
如果你发现自动装配的 Bean 不是你想要的,你也可以 disable 它。比如说,我不想要自动装配 Database 的那些Bean:
1 | (exclude = {DataSourceAutoConfiguration.class}) |
相关文章
1、Spring Boot 2.0系列文章(一):Spring Boot 2.0 迁移指南
2、Spring Boot 2.0系列文章(二):Spring Boot 2.0 新特性详解
3、Spring Boot 2.0系列文章(三):Spring Boot 2.0 配置改变
4、Spring Boot 2.0系列文章(四):Spring Boot 2.0 源码阅读环境搭建
5、Spring Boot 2.0系列文章(五):Spring Boot 2.0 项目源码结构预览
6、Spring Boot 2.0系列文章(六):Spring boot 2.0 中 SpringBootApplication 注解详解
7、Spring Boot 2.0系列文章(七):SpringApplication 深入探索
总结
本文主要讲了 SpringBootApplication 注解,然后展开写了其包含的三个注解 SpringBootConfiguration、ComponentScan、EnableAutoConfiguration
最后
虽然源码很难,但随着不断的探索,源码在你面前将会一览无遗,享受这种探索后的成就感!加油!骚年!
自己本人能力有限,源码看的不多,上面如有不对的还请留言交流。