大牛深入解析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
推荐阅读
- 国家工业互联网标识解析二级节点(威海)上线
- 全新8核国产CPU深入探秘:马上能买到
- 多就是好吗?解析智能手机多摄发展困局
- 新基建下,系统集成商数字化建设及渠道管理深度解析
- 四个维度解析区域发展与治理
- 智媒视角看深圳用数据解析城市
- “联邦的战斗力量”再现,华硕Z490主板机动战士高达版解析
- 天翼云全国首个工业互联网平台二级解析节点上线
- 16G运存+256G内存,专业骁龙865旗舰,性价比深入人心
- 深入理解Netty编解码、粘包拆包、心跳机制