spring boot源码分析(一)之SpringBootApplication注解

一、前言

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注解即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值