Spring Boot 2.0系列文章(六):Spring Boot 2.0中SpringBootApplication注解详解

nature-3201015_1920

SpringBoot 系列文章

关注我

mark

转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/19/SpringBootApplication-annotation/

概述

许多 Spring Boot 开发者喜欢他们的应用程序使用自动配置、组件扫描、并能够在他们的 “Application” 类上定义额外的配置。 可以使用一个 @SpringBootApplication 注解来启用这些功能。

1
2
3
4
5
6
7
8
9
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, args);
}
}

@SpringBootApplication

跟进去 @SpringBootApplication 注解可以发现下图:

springbootapplication

其中标注的三个注解正能解决我们上面所说的三种功能,它们是:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

该接口除了上面三个注解外,还有四个方法如下:

springbootapplication

  • Class<?>[] exclude() default {}:
    根据 class 来排除,排除特定的类加入 spring 容器,传入参数 value 类型是 class 类型。
  • String[] excludeName() default {}:
    根据 class name 来排除,排除特定的类加入 spring 容器,传入参数 value 类型是 class 的全类名字符串数组。
  • String[] scanBasePackages() default {}:
    指定扫描包,参数是包名的字符串数组。
  • Class<?>[] scanBasePackageClasses() default {}:
    扫描特定的包,参数类似是 Class 类型数组。

就拿 scanBasePackages 来举个例子:

1
@SpringBootApplication(scanBasePackages = {"com.zhisheng.controller","com.zhisheng.model"})

将不需要的 bean 排除在 spring 容器中,如何操作?看看官方的代码怎么用的:

sb-enableautoconfig-exclude

@SpringBootConfiguration

springbootconfiguration

@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到srping容器中,并且实例名就是方法名。

configuration

虽说现在已经推荐使用 Spring Boot 里面的 @SpringBootConfiguration 注解,为了探个究竟,我们还是继续研究下 @Configuration 注解。

@Configuration

@Configuration 标注在类上,相当于把该类作为 spring 的 xml 配置文件中的 <beans>,作用为:配置 spring 容器(应用上下文)

1
2
3
<beans>

</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
@ComponentScan(basePackages = {"com.zhisheng.controller","com.zhisheng.model"})

以前是在 xml 配置文件中设置如下标签:<context:component-scan>(用来扫描包配置)

除了可以使用 @ComponentScan 注解来加载我们的 bean,还可以在 Application 类中使用 @Import 指定该类。

例如:

1
@Import({ConsulConfig.class, Log4jEndPointConfiguration.class})	//直接 imoport 要引入的类

@EnableAutoConfiguration

@EnableAutoConfiguration的作用启动自动的配置,@EnableAutoConfiguration注解的意思就是Springboot根据你添加的 jar 包来配置你项目的默认配置,比如根据spring-boot-starter-web ,来判断你的项目是否需要添加了webmvctomcat,就会自动的帮你配置 web 项目中所需要的默认配置。简单点说就是它会根据定义在 classpath 下的类,自动的给你生成一些 Bean,并加载到 Spring 的 Context 中。

enable-autoconfiguration

2018-04-19_18-44-22

可以看到 import 引入了 AutoConfigurationImportSelector 类。该类使用了 Spring Core 包的 SpringFactoriesLoader 类的 loadFactoryNamesof() 方法。

AutoConfigurationImportSelector 类实现了 DeferredImportSelector 接口,并实现了 selectImports 方法,用来导出Configuration 类。

getconfigurations

1
List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

getconfigurations01

导出的类是通过 SpringFactoriesLoader.loadFactoryNames() 读取了 ClassPath 下面的 META-INF/spring.factories 文件。

loadfactoryname

这个文件内容大致如下。

springfactories

后面继续会写自动配置方面的博客,请继续关注!

如果你发现自动装配的 Bean 不是你想要的,你也可以 disable 它。比如说,我不想要自动装配 Database 的那些Bean:

1
@EnableAutoConfiguration(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

最后

虽然源码很难,但随着不断的探索,源码在你面前将会一览无遗,享受这种探索后的成就感!加油!骚年!

自己本人能力有限,源码看的不多,上面如有不对的还请留言交流。

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 关注我
  2. 2. 概述
  3. 3. @SpringBootApplication
  4. 4. @SpringBootConfiguration
    1. 4.1. @Configuration
    2. 4.2. @Bean
  5. 5. @ComponentScan
  6. 6. @EnableAutoConfiguration
  7. 7. 相关文章
  8. 8. 总结
  9. 9. 最后