springboot 注解

116 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第N天,点击查看活动详情

注解解析

@SpringBootApplication 是一个“三体”结构,实际上它是一个复合 Annotation:

@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}
)}
)

虽然它的定义使用了多个 Annotation 进行元信息标注,但实际上对于
SpringBoot 应用来说,重要的只有三个 Annotation,而“三体”结构实际上
指的就是这三个 Annotation:
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
所以,如果我们使用如下的 SpringBoot 启动类,整个 SpringBoot 应用依
然可以与之前的启动类功能对等:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,
args);
}
}

但每次都写三个 Annotation 显然过于繁琐,所以写一个 @SpringBootApplication 这样的一站式复合 Annotation 显然更方便些。

@SpringBootConfiguration

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {
@AliasFor(
annotation = Configuration.class
)
boolean proxyBeanMethods() default true;
}

这里的 @Configuration 对我们来说并不陌生,它就是 JavaConfig 形式的 Spring IoC 容器的配置类使用的那个 @Configuration,既然 SpringBoot 应用骨子里就是一个 Spring 应用,那么,自然也需要加载某个 IoC 容器的 配置,而 SpringBoot 社区推荐使用基于 JavaConfig 的配置形式,所以, 很明显,这里的启动类标注了 @SpringBootConfiguration 之后,本身其 实也是一个 IoC 容器的配置类!很多 SpringBoot 的代码示例都喜欢在启动 类上直接标注 @SpringBootConfiguration或者 @SpringBootApplication,对于初接触 SpringBoot 的开发者来说,其实 这种做法不便于理解,如果我们将上面的 SpringBoot 启动类拆分为两个独 立的 Java 类,整个形势就明朗了:

// 配置类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class DemoConfiguration {
public DemoConfiguration(){}
}
//运行类
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoConfiguration.class,
args);
}
}

所以,启动类 DemoApplication 其实就是一个标准的 Standalone(单独) 类型 Java 程序的 main 函数启动类,没有什么特殊的。而 @SpringBootConfiguration标注的 DemoConfiguration 定义其实也是一 个普通的 JavaConfig 形式的 IoC 容器配置类。 @EnableAutoConfiguration 是借助 @Import 的帮助,将所有符合自动配置条件的 bean 定义加载到 IoC 容器,仅此而已! @EnableAutoConfiguration 作为一个复合 Annotation,其自身定义关键 信息如下:

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY =
"spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}

其中,最关键的要属 @Import (AutoConfigurationImportSelector.class}),借助 AutoConfigurationImportSelector,@EnableAutoConfiguration 可以帮 助 SpringBoot 应用将所有符合条件的 @SpringBootConfiguration配置都 加载到当前 SpringBoot 创建并使用的 IoC 容器. 借助于 Spring 框架原有的一个工具类:SpringFactoriesLoader 的支持, @EnableAutoConfiguration 可以“智能”地自动配置功效才得以大功告成!