大牛深入解析SpringBoot核心运行原理和运作原理源码( 二 )


@SpringBootApplicationpublic class SpringLearnApplication {public static void main(String[] args) {SpringApplication. run(DemoApplication. class, args);}}这里的 main 方法并无特别之处 , 就是一一个标准的 Java 应用的 main 方法,用于启动 SpringBoot 项目的入口 。 在默认情况下 , 按照上述规则命名并包含 main 方法的类称为入口类 。
在 Spring Boot 入口类(除单元测试外)中 , 唯一的一个注解就是@SpringBootApp-lication 。
它是 Spring Boot 项目的核心注解 , 用于开启自动配置 , 准确说是通过该注解内组合的@EnableAutoConfiguration 开启了自动配置 。
@SpringBootApplication 部分源代码如下 。
@Target(ElementType . TYPE)@Retent ion(Retent ionPolicy . RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfi guration@ComponentScan( excludeFilters = {@Filter(type = FilterType .CUSTOM, classes = TypeExcludeFilter. class),@Filter(type = FilterType. CUSTOM,classes = AutoConf igurationExcludeFilter . 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 = "basePackageClassClass[] scanBasePackageClasses() default {};//指定是否代理@Bean 方法以强制执行 bean 的生命周期行为@AliasFor( annotation = Configuration.class)boolean proxyBeanMethods() default true ; }通过源代码可以看出 , 该注解提供了以下成员属性(注解中的成员变量以方法的形式体现) 。
exclude:根据类(Class) 排除指定的自动配置 , 该成员属性覆盖了@SpringBoot-Application中组合的@ EnableAutoConfiguration 中定义的 exclude 成员属性 。
excludeName :根据类名排除指定的自动配置 , 覆盖了@ EnableAutoConfiguration 中的excludeName 的成员属性 。
:scanBasePackages:指定扫描的基础 package , 用于激活@Component 等注解类的初始化 。
scanBasePackageClasses:扫描指定的类 , 用于组件的初始化 。
:proxyBeanMethods:指定是否代理@ Bean 方法以强制执行 bean 的生命周期行为 。 此功能需要通过运行时生成 CGLIB 子类来实现方法拦截 。 该子类有一定的限制 , 比如配置类及其方法不允许声明为 final 等 。
proxyBeanMethods 的默认值为 true , 允许配置类中进行 inter-beanreferences (bean 之 间的引用)以及对该配置的@Bean 方法的外部调用 。 如果@Bean 方法都是自包含的 , 并且仅提供了容器使用的普通工程方法的功能 , 则可设置为 false,避免处理 CGLIB 子类 。 SpringBoot 2.2 版本上市后新增该成员属性 , 后面章节涉及的自动配置类中基本都会用到proxyBeanMethods,一 般情况下都配置为 false 。
通过以上源代码我们会发现 , Spring Boot 中大量使用了@AliasFor 注解 , 该注解用于桥接到其他注解 , 该注解的属性中指定了所桥接的注解类 。 如果点进去查看 , 会发现@SpringBootApplication 定 义的属性在其他注解中已经定义过了 。 之所以使用@AliasFor注解并重新在@SpringBootApplication 中定义,更多是为了减少用户使用多注解带来的麻烦 。
@SpringBootApplication


推荐阅读