一、前言
spring boot 是基于spring框架搭建的简化spring初始配置和开发的全新框架,主要致力于更容易的创建只需启动的独立的生产级应用。其在spring的基础之上,主要有以下特点:
- 可独立运行的spring应用
- 内嵌tomcat、jetty、Undertow 等容器(无需部署war包)
- 提供starter简化配置
- 自动配置spring或第三方库依赖
- 提供生产特性(指标、健康检查、外部化配置)
- 无需生成代码以及配置xml
创建一个spring boot应用非常简单,此处略过,从启动类开始分析。
// 此注解必须添加
@SpringBootApplication
public class UaaAplication {
// main方法直接调用SpringApplication类的run方法即可穷应用
public static void main(String[] args) {
SpringApplication.run(UaaAplication.class,args);
}
}
二、SpringBootApplication注解分析
SpringBootApplication注解是一个复合注解,主要包含SpringBootConfiguration、
EnableAutoConfiguration、ComponentScan三个注解,其功能主要和注解对应,有三个功能:
- 配置文件类,声明一个或多个bean方法,用于bean注入
- 触发自动配置
- 指明包扫描路径(默认为当前启动类所在包路径)
/**
* Indicates a {@link Configuration configuration} class that declares one or more
* {@link Bean @Bean} methods and also triggers {@link EnableAutoConfiguration
* auto-configuration} and {@link ComponentScan component scanning}. This is a convenience
* annotation that is equivalent to declaring {@code @Configuration},
* {@code @EnableAutoConfiguration} and {@code @ComponentScan}.
*
* @author Phillip Webb
* @author Stephane Nicoll
* @author Andy Wilkinson
* @since 1.2.0
*/
@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 {
SpringBootApplication还包含四个java的注解,也就是元注解(可作用于其他注解)。
// 标记注解作用对象(类、字段、方法、参数等,详见java.lang.annotation.ElementType类)
@Target(ElementType.TYPE)
// 保留级别 指明注解保存级别 源码阶段 class阶段 以及 运行阶段
// 源码阶段: 注解信息存在于编译器处理期间,编译器处理完之后就没了(class文件中不存在了)
// class阶段:注解信息存在于class文件中
// 运行阶段:注解信息也会被JVM虚拟机加载,可以通过反射获取注解信息
@Retention(RetentionPolicy.RUNTIME)
//是否出现在javadoc中
@Documented
// 注解是否具有继承性(父类上的注解具有@Inherited注解,那么子类继承父类后能获取到父类上的注解)
@Inherited
@SpringBootApplication是使用@interface 来声明的一个spring boot注解,其本质是代表声明的注解实现了 java.lang.annotation.Annotation 接口,只是和通常implements实现的接口不同,其实现细节都是有编译器来完成的。
三、SpringBootApplication注解属性分析
public @interface SpringBootApplication {
/**
* Exclude specific auto-configuration classes such that they will never be applied.
* 排除指定的自动配置类,这些类中定义的bean不会添加到spring容器中
* @return the classes to exclude
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
Class<?>[] exclude() default {};
/**
* Exclude specific auto-configuration class names such that they will never be
* applied.
* @return the class names to exclude
* @since 1.3.0
*/
@AliasFor(annotation = EnableAutoConfiguration.class)
String[] excludeName() default {};
/**
* Base packages to scan for annotated components. Use {@link #scanBasePackageClasses}
* for a type-safe alternative to String-based package names.
* <p>
* <strong>Note:</strong> this setting is an alias for
* {@link ComponentScan @ComponentScan} only. It has no effect on {@code @Entity}
* scanning or Spring Data {@link Repository} scanning. For those you should add
* {@link org.springframework.boot.autoconfigure.domain.EntityScan @EntityScan} and
* {@code @Enable...Repositories} annotations.
* @return base packages to scan
* @since 1.3.0
*/
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
SpringBootApplication注解通过AliasFor注解 显示的覆盖元注解中的属性,覆盖后的属性值等同于元注解中的属性,例如:
@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")
String[] scanBasePackages() default {};
// 该注解显示覆盖ComponentScan注解中的basePackages属性,当 // SpringBootApplication注解的scanBasePackages属性中传入值时,相当于ComponentScan的 // basePackages属性也具有值。
四、总结
SpringBootApplication是一个复合注解,将SpringBootConfiguration、
EnableAutoConfiguration、ComponentScan注解以及其属性整合在一起,从而具备了各自的能力,启动时只需在启动类上标注@SpringBootApplication注解即可。