文章目录
- 〇、准备工作
- 一、SpringBootApplication.java源码解析
- 1.源码
- 2.自定义注解
- 3.组合注解
- 4.注解@ComponentScan
- 过滤器
- 5.注解@SpringBootConfiguration
- @Configuration
- 6.注解@EnableAutoConfiguration
本文章是Spring Boot源码解读与原理分析系列博客的第一篇,将会介绍一些准备工作和Spring Boot的项目启动的原理和源码。
〇、准备工作
- 环境:
jdk 1.8 + Maven 3.3.9或以上版本 + IDEA
SpringBoot 2.7.13
- 启动类:
创建项目后会自动创建一个启动类,运行main方法就可以启动项目,代码如下:
package tracy.springbootcode;@SpringBootApplication
public class SpringBootCodeApplication {public static void main(String[] args) {SpringApplication.run(SpringBootCodeApplication.class, args);}}
可以说,@SpringBootApplication是其中最关键的东西。本文章将围绕它展开。
一、SpringBootApplication.java源码解析
1.源码
@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)Class<?>[] exclude() default {};@AliasFor(annotation = EnableAutoConfiguration.class)String[] excludeName() default {};@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")String[] scanBasePackages() default {};@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")Class<?>[] scanBasePackageClasses() default {};@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")Class<? extends BeanNameGenerator> nameGenerator() default BeanNameGenerator.class;@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}
2.自定义注解
关于自定义注解的相关知识可以先看我这篇博客了解一下。
以下四个元注解用于定义@SpringBootApplication这个注解:
@Target(ElementType.TYPE)//注解的作用目标是类、接口(包括注解类型)或枚举声明。
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited//此注解可被继承
3.组合注解
@SpringBootApplication是一个组合注解,它等价于同时标注 @Configuration + @EnableAutoConfiguration + @ComponentScan 。
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {...
}
4.注解@ComponentScan
可以指定包扫描的根路径,让 SpringFramework 来扫描指定包及子包下的组件;也可以不指定路径,默认扫描当前配置类所在包及子包里的所有组件,所以启动类才会放到所有类所在包的最外层。
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
过滤器
这段代码是使用Spring框架中的注解来指定Spring Boot自动配置时需要排除的类。
具体来说,这里使用了两个@Filter注解,分别指定了需要排除的类的类型以及具体的类名:
-
第一个@Filter注解的type属性值为FilterType.CUSTOM,表示需要使用自定义的过滤器来进行过滤;
classes属性指定了具体的自定义过滤器类,这里是TypeExcludeFilter.class。 它会从 BeanFactory (可以暂时理解成IOC容器)中获取所有类型为 TypeExcludeFilter 的组件,去执行自定义的过滤方法。由此可见,TypeExcludeFilter 的作用是做扩展的组件过滤。 -
第二个@Filter注解同样是type属性值为FilterType.CUSTOM,表示需要使用自定义过滤器;
classes属性指定了另一个自定义过滤器类,这里是AutoConfigurationExcludeFilter.class。会将不需要自动配置的类屏蔽掉。
这两个自定义过滤器的作用是根据一定的规则来排除不需要自动配置的类。例如,TypeExcludeFilter可以排除特定类型的类,AutoConfigurationExcludeFilter可以排除不需要自动配置的类。这样就可以在Spring Boot自动配置过程中,针对某些类进行自定义的过滤和排除,从而更加灵活地控制自动配置的行为。
5.注解@SpringBootConfiguration
- @SpringBootConfiguration的定义:
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
@Indexed
public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;
}
@SpringBootConfiguration被 @Configuration 标注,说明它实际上是标注配置类的,而且是标注主启动类的。
也就是说,在启动类上使用这个注解表明该类是一个配置类,也是当前项目的主启动类。
@Configuration
被 @Configuration 标注的类,会被 Spring 的IOC容器认定为配置类。一个被 @Configuration 标注的类,相当于一个 applicationContext.xml 的配置文件。
6.注解@EnableAutoConfiguration
这一个注解是spring boot自动装配的核心注解,篇幅较多,放到下一篇博客中进行介绍。