阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

@SpringBootApplication

366次阅读
没有评论

共计 4289 个字符,预计需要花费 11 分钟才能阅读完成。

1、自动装配概述

Spring Boot 自动装配会尝试着装载开发人员在应用的 Class Path 下添加的 JAR 文件依赖, 比如当 HSQLDB 存在于应用的 Class Path 时, 开发人员不需要手动配置数据库连接的 Beans, 而是由 Spring Boot 自动装配一个内存型的数据库。

激活自动装配的注解是 @EnableAutoConfigure 和 @SpringBootApplication。

2、@SpringBootApplication

2.1 理解 @SpringBootApplication 注解语义

2.1.1 @SpringBootApplication 概述

官方解释 @SpringBootApplication 等价于 @EnableAutoConfiguration、@ComponetScan 和 @Configuration。其中 @EnableAutoConfiguration 负责激活 Spring Boot 自动装配机制,@ComponetScan 激活 @Componet 的扫描,@Configuration 声明被标注为配置类。

案例:

重构 first-springboot 应用在项目引导类中将 @SpringBootApplication 注解替换为三注解声明方式, 代码如下:

//@SpringBootApplication @EnableAutoConfiguration// 开启自动装配 @ComponentScan// 包扫描 @Configuration// 标识为配置类 public class FirstSpringbootApplication {public static void main(String[] args) {SpringApplication.run(FirstSpringbootApplication.class, args); } }

2.1.2 查看 @SpringBootAppliction 源码

@Target(ElementType.TYPE) // 表示此注解的标识范围为接口、类、枚举 @Retention(RetentionPolicy.RUNTIME) // 元注解,表示注解不仅保存在 class 文件是,并且 jvm 加载 class 文件之后,仍然存在 @Documented // 表示该注解会被 javadoc 工具记录 @Inherited // 表示该注解会被子类继承 @SpringBootConfiguration // 与 @Configuration 作用相似,标识为配置类 @EnableAutoConfiguration // 开启自动装配 @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })// 从何处扫描 Bean public @interface SpringBootApplication {

@SpringBootApplication:@EnableAutoConfiguration、@ComponetScan 和 @SpringBootConfiguration 的组合,不过 @ComponetScan 并非使用了默认值, 而是添加了排除的 TypeFilter 实现:TypeExcludeFilter 和 AutoConfigurationExcludeFilter。

2.1.3 查看 @SpringBootConfiguration 源码

@Target({ElementType.TYPE}) // 表示此注解的标识范围为接口、类、枚举 @Retention(RetentionPolicy.RUNTIME) // 元注解,表示注解不仅保存在 class 文件是,并且 jvm 加载 class 文件之后,仍然存在 @Documented // 表示该注解会被 javadoc 工具记录 @Configuration // 标识为配置类 public @interface SpringBootConfiguration {@AliasFor(annotation = Configuration.class) boolean proxyBeanMethods() default true; }

@AliasFor 注解 :能够将一个或多个注解的属性 ” 别名 ” 放在某个注解中。

2.2 @SpringBootApplication 属性别名

@SpringBootApplication 源码如下:

@Target(ElementType.TYPE) // 表示此注解的标识范围为接口、类、枚举 @Retention(RetentionPolicy.RUNTIME) // 元注解,表示注解不仅保存在 class 文件是,并且 jvm 加载 class 文件之后,仍然存在 @Documented // 表示该注解会被 javadoc 工具记录 @Inherited // 表示该注解会被子类继承 @SpringBootConfiguration // 与 @Configuration 作用相似,标识为配置类 @EnableAutoConfiguration // 开启自动装配 @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) // 从何处扫描 Bean 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 = Configuration.class) boolean proxyBeanMethods() default true; }

案例:

重构 first-springboot 将 HelloController 移动到 com.tyschool 包下, 修改启动类使控制器能正常访问

启动类代码如下:

@SpringBootApplication(scanBasePackages = {"com.tyschool"}) public class FirstSpringbootApplication {public static void main(String[] args) {SpringApplication.run(FirstSpringbootApplication.class, args); } }

3、@SpringBootApplication 标注非引导类

案例:

将启动类上的 @SpringBootApplication 去掉, 添加非引导类,在非引导类上标注 @SpringBootApplication 注解, 修改 SpringApplication.run() 方法中的 class 为非引导类

非引导类代码如下:

@SpringBootApplication(scanBasePackages = {"com.tyschool.firstspringboot.controller"}) public class WebConfig { }

引导类代码如下:

public class FirstSpringbootApplication {public static void main(String[] args) {SpringApplication.run(WebConfig.class, args); } }

4、@SpringBootApplication“继承”@Configuration CGLIB 提升特性

@SpringBootApplication 作为 @Configuration 的 ” 派生 ” 注解, 同样继承其注解特性, 其中最明显的是 CGLIB 提升。因为 @Bean 在 @Componet 类中与正常的 Java 对象语义相同, 不存在 CGLIB 处理, 而后在 @Configuration 中则执行了 CGLIB 提升

案例:

验证 @SpringBootApplication CGLIB 提升特性

WebConfig 代码如下:

@SpringBootApplication public class WebConfig {// 定义路由, 访问 /helloworld, 返回 Hello,World @Bean public RouterFunction<ServerResponse> helloWorld() {return RouterFunctions.route(RequestPredicates.GET("/helloWorld"), request -> ServerResponse.ok().body(Mono.just("Hello,World"), String.class) ); } // 项目启动时, 打印相关信息 @Bean public ApplicationRunner runner(BeanFactory beanFactory){return args -> {System.out.println("当前 hello Bean 实现类为:"+beanFactory.getBean("helloWorld").getClass().getName()); System.out.println("当前 WebConfiguration Bean 实现类为:"+beanFactory.getBean(WebConfig.class).getClass().getName()); }; } }

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计4289字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7815576
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
开发者福利:免费 .frii.site 子域名,一分钟申请即用

开发者福利:免费 .frii.site 子域名,一分钟申请即用

  开发者福利:免费 .frii.site 子域名,一分钟申请即用 前言 在学习 Web 开发、部署...
小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比

小白也能看懂:什么是云服务器?腾讯云 vs 阿里云对比 星哥玩云,带你从小白到上云高手。今天咱们就来聊聊——什...
4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

4盘位、4K输出、J3455、遥控,NAS硬件入门性价比之王

  4 盘位、4K 输出、J3455、遥控,NAS 硬件入门性价比之王 开篇 在 NAS 市场中,威...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛NAS-12:开源笔记的进化之路,效率玩家的新选择

星哥带你玩飞牛 NAS-12:开源笔记的进化之路,效率玩家的新选择 前言 如何高效管理知识与笔记,已经成为技术...
星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定!

星哥带你玩飞牛 NAS-9:全能网盘搜索工具 13 种云盘一键搞定! 前言 作为 NAS 玩家,你是否总被这些...
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...