@SpringBootApplication注解用在Spring Boot的入口类上面,是Spring Boot提供的应用启动相关的注解。

直接上注解的源码:

@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 { @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "exclude")
Class<?>[] exclude() default {}; @AliasFor(annotation = EnableAutoConfiguration.class, attribute = "excludeName")
String[] excludeName() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {}; @AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")
Class<?>[] scanBasePackageClasses() default {};

}

@SpringBootApplication是一个复合注解

查看源码,可以发现@SpringBootApplication是一个复合注解,包含了@SpringBootConfiguration,@EnableAutoConfiguration和@ComponentScan三个注解。

对这三个注解进行逐一解析:

@SpringBootConfiguration

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

@SpringBootConfiguration和@Configuration都可以理解为Spring传统XML配置里的<beans>标签,而@Bean则是<bean>标签。

@Configuration和@Bean并不是Spring Boot的特有标签,普通的Spring项目也可以使用,只是普通的Spring项目在使用大多数注解的时候要扫包才能生效,要注意加上扫包配置<context:component-scan base-package="com.yanggb.xxx" />。而Spring Boot只需要保证启动启动main入口在这些类的上层包就行,不需要特别加上扫包配置。

Spring传统XML配置:

<beans>
<bean id="car" class="com.yanggb.Car">
<property name="wheel" ref="wheel"></property>
</bean>
<bean id="wheel" class="com.yanggb.Wheel"></bean>
</beans>

Spring新型注解配置:

@Configuration // 相当于<beans>
public class CarConfig { @Bean // 相当于<bean>
public Car car() {
Car car = new Car();
car.setWheel(wheel()); // 相当于<property>
return car;
} @Bean
public Wheel wheel() {
return new Wheel();
}

}

两种方式最后产生的结果是相同的。

@EnableAutoConfiguration

@EnableAutoConfiguration的作用是启动自动配置,意思是Spring Boot会根据你添加的jar包来配置你项目的默认设置,比如你添加了Spring Boot提供的spring-boot-starter-web依赖,其中包含了Tomcat和Spring MVC,这个注释就会假设你正在开发一个Web应用程序,自动地帮你添加Web项目中所需要的Spring配置。

@ComponentScan

@ComponentScan的作用是扫描当前包及其子包下被@Component注解标记的类并纳入到Spring容器中进行管理。是Spring传统XML配置的<context:component-scan>的替代。

@Controller,@Service,@Repository是@Component的子注解,所以也会被@ComponentScan扫描并做和@Component相同的处理。

@ComponentScan提供了basePackage参数定义要扫描的包,如果不设置,默认会扫描包的所有类,即默认扫描**/*.class路径,建议加上该参数以减少加载的时间。

@SpringBootApplication提供的参数

exclude

exlude参数继承自@EnableAutoConfiguration注解的同名参数,根据class来排除特定的类加入Spring容器,传入参数的value类型是class类型数组。

@SpringBootApplication(exclude = {Good.class, Bad.class})

excludeName

exludeName参数继承自@EnableAutoConfiguration注解的同名参数,根据className来排除特定的类加入Spring容器,传入参数的value类型是class的全类名字符串数组。

@SpringBootApplication(excludeName = {"com.yanggb.xxx.Good", "com.yanggb.yyy.Bad"})

exclude和excludeName可以用来关闭指定的自动配置,比如关闭数据源相关的自动配置。

scanBasePackages

scanBasePackages参数继承自@ComponentScan注解的basePackages参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。

@SpringBootApplication(scanBasePackages = {"com.yanggb.xxx", "com.yanggb.yyy"})

scanBasePackageClasses

scanBasePackageClasses参数继承自@ComponentScan注解的basePackageClasses参数,指定要扫描的包,传入参数的value类型是包名的字符串数组。

@SpringBootApplication(scanBasePackageClasses = {Good.class, Bad.class})

"到后来,我们只是会说对此无能为力。"

springboot注解@SpringBootApplication分析的更多相关文章

  1. SpringBoot启动原理分析

    用了差不多两年的SpringBoot了,可以说对SpringBoot已经很熟了,但是仔细一想SpringBoot的启动流程,还是让自己有点懵逼,不得不说是自己工作和学习的失误,所以以此文对Spring ...

  2. SpringBoot源码分析之SpringBoot的启动过程

    SpringBoot源码分析之SpringBoot的启动过程 发表于 2017-04-30   |   分类于 springboot  |   0 Comments  |   阅读次数 SpringB ...

  3. SpringBoot启动流程分析(五):SpringBoot自动装配原理实现

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  4. SpringBoot启动流程分析(一):SpringApplication类初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  5. SpringBoot启动流程分析(三):SpringApplication的run方法之prepareContext()方法

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  6. SpringBoot启动流程分析(四):IoC容器的初始化过程

    SpringBoot系列文章简介 SpringBoot源码阅读辅助篇: Spring IoC容器与应用上下文的设计与实现 SpringBoot启动流程源码分析: SpringBoot启动流程分析(一) ...

  7. springboot注解使用说明

    springboot注解 @RestController和@RequestMapping注解 我们的Example类上使用的第一个注解是 @RestController .这被称为一个构造型(ster ...

  8. springBoot系列-->springBoot注解大全

    一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Configuration和@EnableAutoConfiguration ...

  9. SpringBoot注解大全(转)

    原文链接:[springBoot系列]--springBoot注解大全 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Co ...

随机推荐

  1. [福大软工] Z班 团队作业——系统设计 作业成绩

    团队作业--系统设计 作业链接 http://www.cnblogs.com/easteast/p/7709763.html 作业情况 这次作业大家完成度都很高,大家的团队分工,任务布置都安排得很到位 ...

  2. ubuntu集群下ssh配置总结

    最重要的前提就是:集群中的所有机器的用户名和用户组必须一样 一般做法都是在每台机器上新建用户组和用户名. 比如:sudo addgroup sparks 新建用户组sparks: sudo addus ...

  3. cf 20190307 Codeforces Round #543 (Div. 2, based on Technocup 2019 Final Round)

    B. Mike and Children time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  4. Asp.net Web Api开发Help Page配置和扩展

    为了方面APP开发人员,服务端的接口都应当提供详尽的API说明.但每次有修改,既要维护代码,又要维护文档,一旦开发进度紧张,很容易导致代码与文档不一致. Web API有一个Help Page插件,可 ...

  5. 【转】JS中setTimeout和setInterval的最大延时值详解

    前言 JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.而这篇文中主要给大家介绍的是关于JS中setTi ...

  6. Spring Security(十八):5.9 Post Processing Configured Objects

    Spring Security’s Java Configuration does not expose every property of every object that it configur ...

  7. Java8-1-新特性_Lambda表达式

    最近实在是闲的蛋疼, 突然想起前一段时间使用Lambda表达式觉得惊为天人, 所以就去仔细的学习了一下, 整理出一份博客出来供大家观赏. 一. 什么是lambda表达式. Lambda 是一个匿名函数 ...

  8. linux进程管理总结

    目录 一.进程相关的概念 二.关闭会话时子进程进程被杀死 三.nohup的原理 四.setsid原理 五.daemon &和守护进程的区别 六.服务进程为什么要fork两次 七.systemd ...

  9. Java函数式编程和lambda表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  10. ASP.NET MVC必须知道的那些事!

    MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...