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

zhisheng

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

概述

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

1import org.springframework.boot.SpringApplication;
2import org.springframework.boot.autoconfigure.SpringBootApplication;
3
4@SpringBootApplication
5public class Application {
6    public static void main(String[] args) {
7        SpringApplication.run(Application.class, args);
8    }
9}

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

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

@SpringBootConfiguration

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

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

@Configuration

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

1<beans>
2
3</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 中。

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

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

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

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

这个文件内容大致如下。

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

如果你发现自动装配的 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 注解详解

总结

本文主要讲了 SpringBootApplication 注解,然后展开写了其包含的三个注解 SpringBootConfiguration、ComponentScan、EnableAutoConfiguration

最后

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

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

原文发布于微信公众号 - zhisheng(zhisheng_blog)

原文发表时间:2018-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏用户2442861的专栏

使用IntelliJ IDEA 15和Maven 开发Spring Data JPA + MVC Web应用

http://blog.csdn.net/myarrow/article/details/50827370

2271
来自专栏一个会写诗的程序员的博客

第7章 Spring Boot集成模板引擎小结

因为Spring Boot其实是对Spring生态的封装整合打包,以简化开发中使用Spring框架。所以 Spring Boot在集成模板引擎过程中,其实就是对...

2193
来自专栏程序猿DD

Spring Cloud构建微服务架构:消息驱动的微服务(入门)【Dalston版】

之前在写Spring Boot基础教程的时候写过一篇《Spring Boot中使用RabbitMQ》。在该文中,我们通过简单的配置和注解就能实现向RabbitM...

2777
来自专栏JavaEdge

Spring Bean的生命周期Spring简介bean对象生命周期管理

3208
来自专栏Java进阶架构师

写出我的第一个框架:迷你版Spring MVC

原文:https://www.jianshu.com/p/f454662f497e

1923
来自专栏代码拾遗

Spring Boot 2.0 教程 - 深入SpringAplication

可以通过SpringApplication.run() 方法轻松的启动一个Spring应用,例如

1214
来自专栏battcn

一起来学SpringBoot | 第二十八篇:JDK8 日期格式化

在 JDK8 中,一个新的重要特性就是引入了全新的时间和日期API,它被收录在 java.time 包中。借助新的时间和日期API可以以更简洁的方法处理时间和日...

3553
来自专栏Java工程师日常干货

写出我的第一个框架:迷你版Spring MVC前期准备关于自定义注解编写核心控制器:DispatcherServletMake it run!

OK,到这里,一个迷你版的Spring MVC就开发完成了,以前,都是用Spring MVC,从没有想过可以自己开发一个出来,这是我的第一次,我的能量超乎我的想...

1104
来自专栏Java大联盟

SpringMVC笔记(9):国际化

所谓国际化就是指WEB应用在不同的浏览环境中显示不同的语言,如汉语、英语等。Spring MVC框架对国际化操作做了很好的集成,只需简单配置即可完成国际化。

621
来自专栏芋道源码1024

网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化

8783

扫码关注云+社区

领取腾讯云代金券