【Spring Boot源码学习】@SpringBootApplication注解

发布于:2024-10-24 编辑:匿名 来源:网络

简介在花子之前的博文《Spring Boot 核心运行原理介绍》中,我们初步了解了Spring Boot的核心运行原理,并知道@EnableAutoConfiguration是一个用于启用自动配置的注解。但是创建过Spring Boot项目的读者肯定会说我们没有直接看到这个注解。

其实之前我也提到过,是通过组合注解@SpringBootApplication引入的。至于@EnableAutoConfiguration的解释,我稍后再深入源码中。

本文首先介绍组合注解@SpringBootApplication。好了,废话不多说,我们看下面的介绍: 主要内容 1. 创建 Spring Boot 项目。

首先我们打开Intellij IDEA开发工具,选择File -> New -> Project然后打开New Project,选择Spring Initializr【这个是用来创建Spring Boot项目的】:选择Next,打开Project Metadata【这里可以配置一些项目的基本信息]:继续下一步并打开依赖项[如有必要,添加其他依赖项]:继续下一步并选择您的 Spring Boot 项目位置:最后单击完成。注意:在新创建的项目中,如果由于Spring Boot版本问题导致项目报错,则尝试其他版本。

2、Spring Boot入口类上述新建的项目创建完成后,会默认生成一个XXXApplication入口类。默认情况下,该类的命名规则为artifactId + Application【artifactId首字母大写】:如上图所示,DemoApplication是我们Spring Boot项目的入口类。

代码如下: 代码语言:java copy package com.example .demo;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication { public static void main(String[ ] args) { SpringApplication.run(DemoApplication.class, args); }}在上述Spring Boot入口类DemoApplication中,唯一的注解是@SpringBootApplication。前面我们提到,它通过其内部组合@EnableAutoConfiguration来开启自动配置功能。

我们来详细介绍一下@SpringBootApplication注解: 3.@SpringBootApplication介绍 首先看@SpringBootApplication的源码【版本:2.7.9】: 代码语言:java copy @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 {/** * 排除特定的自动配置类,使其永远不会被应用 * @return 要排除(禁用)的类 */@AliasFor(annotation = EnableAutoConfiguration.class)Class[] except() default {};/** * 排除特定的自动配置类名称以确保它们永远不会被应用 * @return 要排除的自动配置类名称 * @since 1.3.0 */@AliasFor(annotation = EnableAutoConfiguration.class) String[ ] exceptName() default {};/** * 用于扫描带注释组件的基础包。使用 {@link #scanBasePackageClasses} 为基于字符串的包名称提供类型安全的替代方案。

*

* 注意:该设置仅对{@code @ComponentScan}注解有效,不影响{@code @Entity}扫描或Spring Data的{@link Repository}扫描。 * 对于这些情况,您应该添加 {@link org.springframework.boot.autoconfigure.domain.EntityScan @EntityScan} 和 * {@code @Enable...Repositories} 注释。

* @return 需要扫描的基础包 * @since 1.3.0 */@AliasFor(annotation = ComponentScan.class, attribute = "basePackages")String[] scanBasePackages() default {};/** * 用于指定需求 一种扫描包中带注释组件的类型安全方法。将扫描包含指定类的包。

*

* 考虑在每个包中创建一个特殊的空类或接口,仅用于此属性引用的标记类。 *

* 注意:该设置仅对{@code @ComponentScan}注解有效,不影响{@code @Entity}扫描或Spring Data的{@link Repository}扫描。

* 对于这些情况,您应该添加 {@link org.springframework.boot.autoconfigure.domain.EntityScan @EntityScan} 和 * {@code @Enable...Repositories} 注释。* @return 待扫描的基础包 * @since 1.3.0 */@AliasFor(annotation = ComponentScan.class, attribute = "basePackageClasses")Class[] scanBasePackageClasses() default {};/** * 使用对于为 Spring 容器中检测到的组件命名的 {@link BeanNameGenerator} 类。

*

* {@link BeanNameGenerator}接口本身的默认值表明应该使用处理此{@code @SpringBootApplication}注解的扫描器继承的bean名称生成器, * 例如默认的{@link AnnotationBeanNameGenerator}或在引导中提供给应用程序上下文的任何自定义实例。 * @return {@link BeanNameGenerator} 要使用 * @see SpringApplication#setBeanNameGenerator(BeanNameGenerator) * @since 2.3.0 */@AliasFor(annotation = ComponentScan.class, attribute = "nameGenerator")Class nameGenerator () default BeanNameGenerator.class;/** * 指定是否应代理 {@link Bean @Bean} 方法以强制执行 Bean 的生命周期行为,例如,即使直接调用 {@code @Bean} 方法在用户代码中, * 也可以返回共享的单例 bean 实例。

此功能需要方法拦截,通过运行时生成的 CGLIB 子类实现,其中包括一些限制,例如不允许将配置类及其方法声明为 {@code Final}。*

* 默认值为 {@code true},它允许配置类中的“bean 间引用”,同时允许从另一个配置类中调用此配置的 {@code @Bean} 方法。

* 如果每个特定于配置的 {@code @Bean} 方法是自包含的,并且设计为供容器使用的普通工厂方法,则可以将此标志切换为 {@code false}, * 以避免 CGLIB 子类处理。 *

* 关闭 Bean 方法拦截实际上会单独对待 {@code @Bean} 方法,就好像它们是在非 {@code @Configuration} 类上声明的,即“@Bean Lite 模式” * (参见{@link Bean @Bean 文档})。

因此,该行为相当于删除 {@code @Configuration} 注解。 * @since 2.2 * @return 是否代理{@code @Bean}方法 */@AliasFor(annotation = Configuration.class)boolean proxyBeanMethods() default true;} 通过查看上面的源码,我们可以看到@SpringBootApplication注解提供了以下成员属性【这里大家默认都知道注解中的成员变量是以方法的形式存在的】:exclusion:排除指定的基于类(Class)的自动配置。

该成员属性覆盖了 @EnableAutoConfiguration 中定义并结合在 @SpringBootApplication 中的排除成员属性。 exceptName:根据类名排除指定的自动配置,覆盖@EnableAutoConfiguration中定义的excludeName成员属性。

scanBasePackages:指定扫描的基础包,用于扫描带有注解组件的基础包,例如包含@Component等注解的组件。 scanBasePackageClasses:指定扫描的类,用于相关组件的初始化。

nameGenerator:BeanNameGenerator 类,用于命名 Spring 容器中检测到的组件。 proxyBeanMethods:指定是否对 @Bean 方法进行编码以强制执行 bean 的生命周期行为。

该功能需要通过在运行时生成CGLIB子类来实现方法拦截。但是,它包含某些限制。

例如,配置类及其方法不允许被声明为final。 proxyBeanMethods 的默认值为 true,允许配置类中的 bean 间引用以及对配置的 @Bean 方法的外部调用。

如果@Bean方法都是自包含的并且仅提供容器使用的正常工程方法的功能,则可以将它们设置为false以避免处理CGLIB子类。另外,从源码中的@since 2.2中我们还可以看到,这个属性是在Spring Boot 2.2版本中添加的。

细心的读者可能看过上面的源码,发现@AliasFor注解大量使用在@SpringBootApplication注解的成员属性上。这个注解的作用是什么? @AliasFor注解用于桥接其他注解,其注解属性指定桥接的注解类。

如果我们点击注解属性配置的注解,可以看到@SpringBootApplication注解的成员属性实际上已经在其他注解中定义了。之所以在@SpringBootApplication中使用并重新定义@AliasFor注解,主要是为了减少用户使用多个注解的麻烦。

知识扩展: 简单总结一下@AliasFor的作用: 定义别名关系:通过在注解属性上使用@AliasFor注解,可以在一个属性和另一个属性之间建立别名关系。这意味着在使用注解时,可以使用alias属性来设置目标属性的值。

属性互操作性:通过在两个属性上使用@AliasFor注解并将它们的属性属性设置为彼此,可以实现属性之间的双向关联。这意味着当设置其中一个属性的值时,另一个属性会自动分配相同的值。

注解继承:当一个注解A使用@AliasFor注解指定另一个注解B的属性作为自己的别名属性时,如果该类使用了注解A,则注解B的相关属性也会被相应设置。 Spring Boot早期版本中没有@SpringBootConfiguration注解。

它是后来版本中新添加的,它结合了@Configuration注解,如下图: @EnableAutoConfiguration注解结合了@AutoConfigurationPackage注解,如下图: 除了一些元注解和基本注解之外,我们用一个类图来描述@SpringBootApplication注解的组合结构: 从上图我们可以总结出@SpringBootApplication注解的核心作用,如下: 结合@EnableAutoConfiguration用于启用Spring Boot的自动配置功能;与@ComponentScan结合,用于激活@Component及其他注解类的初始化;与@SpringBootConfiguration结合,用于标识一个类作为配置类,用于Spring应用上下文中的配置。综上所述,本文回顾了@SpringBootApplication注解的源码,并介绍了它的成员属性和组合注解。

这些内容将为我们后续的源码学习打下基础。

【Spring Boot源码学习】@SpringBootApplication注解

站长声明

版权声明:本文内容由互联网用户自发贡献,本站不拥有所有权,不承担相关法律责任。如果发现本站有涉嫌抄袭的内容,欢迎发送邮件 举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。

标签:

相关文章

  • 金晶科技完成新一轮融资扩大新生产场地

    金晶科技完成新一轮融资扩大新生产场地

    投资圈(ID:pedaily)3月1日消息,北京金晶科技股份有限公司近日宣布完成新一轮融资。 本轮融资由浪美创投、广州科学城创投、金鼎资本、康宇资本等联合投资,融资资金主要用于公司金宇智能制造工厂新生产基地的扩建。 扩建后的新场地将用于定型产品的小批量生产。 金晶科技是

    06-17

  • 中集集团联合成立10亿产业基金

    中集集团联合成立10亿产业基金

    投资界(ID:pedaily)据8月10日消息,中国国际海运集装箱(集团)股份有限公司发布公告,公司间接控股子公司中集资本管理中集资本管理有限公司(简称“中集资本管理”)与专业投资机构万和宏源投资有限公司(简称“万和宏源”)就该项目相关事宜签署《关于中集弘远先进制造产

    06-18

  • 纳米银材料提供商“思尔维”完成数千万元天使轮融资,火山石投资

    纳米银材料提供商“思尔维”完成数千万元天使轮融资,火山石投资

    投资社区(ID:pedaily)领投 7月1日消息,纳米银材料提供商商思尔维宣布完成数千万元人民币融资本轮融资由火山石投资领投,光伏上下游产业资本跟投。 本轮融资将用于思尔维在光伏低温银浆等产品的研发和团队拓展。 在双碳和可持续发展的背景下,清洁能源和低碳转型成为当务之

    06-17

  • 一季度全球并购规模突破1万亿美元,美国并购规模同比增长1.6倍

    一季度全球并购规模突破1万亿美元,美国并购规模同比增长1.6倍

    Refinitiv数据显示,今年一季度全球并购价值完成1.3万亿美元,超过历年同期水平。

    06-18

  • 央视315曝光的AI机器人推销公司到底采用了什么核心技术?

    央视315曝光的AI机器人推销公司到底采用了什么核心技术?

    一年一度的央视“晚会”,是企业一年中最“恐惧”的时刻。 昨晚,央视栏目组曝光了多个行业的违规行为。 医疗垃圾、危险的辣条、脏鸡蛋、不卫生的卫生用品、家电售后服务套路等等……其背后的产业链庞大、触目惊心。 其中,智能机器人骚扰电话的曝光,引起了很多人的关注。 因

    06-18

  • 【创业24小时】2023年7月11日

    【创业24小时】2023年7月11日

    全球投融资今日全球市场共发生24起投资披露事件,其中境内16起,境外8起。 其中,国内先进制造业3例、企业服务业5例、医疗健康行业4例、汽车交通行业2例、电子商务行业1例、金融行业的案例。 外企服务业发生1起案件,医疗卫生行业发生2起案件,生活服务业发生1起案件,农业行

    06-18

  • 智慧在粤港澳!汇聚数字原生创新力量,共商云前路

    智慧在粤港澳!汇聚数字原生创新力量,共商云前路

    阿里云加速器带来数字原生创业时光路演,六家加速器企业创始人将带来时光故事分享,涵盖虚实融合、智能网联、自动驾驶、智能网联、智能制造、企业服务赛道。 阿里云智能分发生态系统及中小企业事业部总经理潘立维、阿里云智能云原生应用平台王牌(舒通)、存储团队Alex、达摩

    06-18

  • 小鹏P5宣布第四季度交付搭载激光雷达

    小鹏P5宣布第四季度交付搭载激光雷达

    》4月15日消息,昨天晚间,小鹏汽车在广州正式发布了该品牌的第三款车型——小鹏P5。 一个紧凑的模型,但将智能提升到了一个新的水平。

    06-18

  • 二手交易平台转转完成3亿美元B轮融资,58同城、腾讯继续参与

    二手交易平台转转完成3亿美元B轮融资,58同城、腾讯继续参与

    据投资界9月11日消息,58同城宣布核心子品牌转转58同城与国内领先的二手交易平台今日与多家投资者达成协议,完成3亿美元B轮融资,并转让上轮投资者58同城和腾讯继续参与本次融资。 投资。 本次融资完成后,58同城将继续持有转转多数股权。 今年4月,转转获得腾讯2亿美元A轮融

    06-17

  • 【清科投资学院】6.29-6.30@深圳 -疫后股权投资行业分析

    【清科投资学院】6.29-6.30@深圳 -疫后股权投资行业分析

    疫情下的极端环境是我们回归投资初心的机会,借机磨练自己,寻求更大的发展机会。 清科投资学院首期线下课程,我们很荣幸邀请到清科集团管理合伙人、清科基金管理合伙人、清科研究中心总经理符星华女士、大辰财智合伙人、以及智能制造行业负责人任俊先生,我们共同创造伟大的

    06-17

  • OTEC2020全球创业大赛·服务与消费升级赛道决赛完美落幕

    OTEC2020全球创业大赛·服务与消费升级赛道决赛完美落幕

    随着移动互联网、移动支付、物联网的发展,国民消费正在加速变革,服务消费占比持续提升,消费行为城乡居民消费主体多元化,个性化、服务化特征显着增强。 为持续推动服务和消费升级领域的创新升级,OTEC与众神之战强强联手,汇聚全球优秀科技创新人才,共同发现行业优秀创新

    06-18

  • “安全版”Note7再次爆炸,美国运营商推出换机服务

    “安全版”Note7再次爆炸,美国运营商推出换机服务

    上个月,由于电池问题,发生多起火灾爆炸事故。 三星发布了 Galaxy 手机的全球(不包括中国)评测。 Note 7启动召回计划。 与此同时,美国几大运营商Sprint、Verizon、AT&T和T-Mobile也不得不集体下架这款手机。 9月底,三星率先在美国市场供应配备安全电池的Note 7,几大运营

    06-17