【API知识】SpringBoot项目中@EnableXXX的原理
@EnableXX注解的使用场景
SpringBoot为开发人员提供了很多便利,例如如果想要定时功能,只要添加@EnableSchedule,即可配合@Schedule注解实现定时任务功能,不需要额外配置定时任务的处理线程,就可以直接使用(框架提供默认配置,在找不到用户自定配置的执行器时,使用默认配置)
@EnableXXX注解给人的感觉就是有一个"开关",只要开关打开就可以对应的功能,非常方便。
有时候,我们可能也想实现一个功能,打包发布后,其他项目只要引入依赖,添加@Enable注解就可以直接使用。
那么@EnableXXX的原理是什么呢?
个人认为@Enable的核心就是将XXX配置引入到当前容器内,而这个操作就由@Import注解来完成,@Import引入的类,一般是配置类,该配置类可能会使用两种方式引入相关的Bean
①在配置类中使用@Bean构造相关的Bean
②使用@ComponentScan扫描指定路径,引入Bean。
这些Bean就用于提供XXX功能。
那如果是这样,直接使用@Import就好了,干嘛还需要@EnableXXX?
直接使用@Import确实够了,但是@EnableXXX有两个好处
①可以整合多个配置,便于记忆。例如要提供XXX功能,可能需要@Import多个配置类
②内容封装且用户友好。用户不需要知道使用XXX功能需要引入哪些配置。直接@Enable就好了。
简单案例
@Enable提供health接口
//project 1
@Target({java.lang.annotation.ElementType.TYPE})
@Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@Documented
@Import({HealthConfig.class}) //指明引入HealthConfig类
public @interface EnableHealth { } @Configuration
@ComponentScan({"com.test.controller"}) //扫描当前项目的controller
public class HealthConfig { } @RestController
public class HealthController { //提供health接口 @GetMapping("/health")
public String health() {
return "{\"status\":\"UP\"}";
}
} //project2
@EnableHealth //开启health功能,最终将HealthController注入到当前容器中
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
1)project1是一个普通的maven项目,封装一个Health功能。
2)project2就是一个普通的SpringBoot项目,只要引入project1依赖,并使用@EnableHealth即可提供health接口
3)project1项目中需要使用Spring的注解,需要引入spring依赖,这可能与project2的版本不同,故project1的spring相关依赖的scope可以指定为provided,由外部提供。
【API知识】SpringBoot项目中@EnableXXX的原理的更多相关文章
- 五分钟后,你将学会在SpringBoot项目中如何集成CAT调用链
买买买结算系统 一年一度的双十一购物狂欢节就要到了,又到剁手党们开始表演的时刻了.当我们把种草很久的商品放入购物车以后,点击"结算"按钮时,就来到了买买买必不可少的结算页面了.让我 ...
- springboot项目中使用maven resources
maven resource 组件可以把pom的变量替换到相关的resouces目录中的资源文件变量 示例项目:内容中心 (文章管理) 生成jar包,生成docker ,生成k8s文件 1.项目结构 ...
- SpringBoot12 QueryDSL01之QueryDSL介绍、springBoot项目中集成QueryDSL
1 QueryDSL介绍 1.1 背景 QueryDSL的诞生解决了HQL查询类型安全方面的缺陷:HQL查询的扩展需要用字符串拼接的方式进行,这往往会导致代码的阅读困难:通过字符串对域类型和属性的不安 ...
- 在SpringBoot项目中添加logback的MDC
在SpringBoot项目中添加logback的MDC 先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...
- 自身使用的springboot项目中比较全的pom.xml
在学习的时候常建新的项目,mark下商用的jar <dependency> <groupId>org.mybatis</groupId> <artifactI ...
- springboot 项目中获取默认注入的序列化对象 ObjectMapper
在 springboot 项目中使用 @SpringBootApplication 会自动标记 @EnableAutoConfiguration 在接口中经常需要使用时间类型,Date ,如果想要格式 ...
- springboot项目中js、css静态文件路径访问
springboot静态文件访问的问题,相信大家也有遇到这个问题,如下图项目结构. 项目结构如上所示,静态页面引入js.css如下所示. 大家肯定都是这样写的,但是运行的话就是出不来效果,图片也不显示 ...
- 解决springboot项目中@Value注解参数值为null的问题
1.错误场景: springboot项目中在.properties文件(.yml)文件中配置了属性值,在Bean中使用@Value注解引入该属性,Bean的构造器中使用该属性进行初始化,此时有可能会出 ...
- springboot项目中引用其他springboot项目jar
1. 剔除要引入的springboot项目中不需要的文件:如Application和ApplicationTests等 2.打包 不能使用springboot项目自带的打包插件进行打包: 3.打包 4 ...
随机推荐
- 从输入URL到页面展示
当我们输入 URL 并按回车后,浏览器会对 URL 进行检查,首先判断URL格式,比如是ftp http ed2k等等,我们这里假设这个URL是http://hellocassie.cn,那么浏览器会 ...
- Linux学习资料地址汇总-不定时更(一)
https://linux.linuxidc.com/ 用户名和密码都是www.linuxidc.com
- Alibaba Sentinel 限流与熔断初探(技巧篇)
目录 1.Sentinel 是什么 ?主要能解决什么问题? 2.限流与熔断的使用场景 3.Sentinel 源码结构 4.在 IntelliJ IDEA 中运行 Sentine Demo 温馨提示:源 ...
- Python卸载
前言 自己瞎折腾下载Python3.8.2,把之前下载好的python3.7.3覆盖掉.在运行之前Python环境的程序多次未果后.找到原因,Python3.7.3的包不支持Python3.8.2.于 ...
- 曹工说mini-dubbo(1)--为了实践动态代理,我写了个简单的rpc框架
相关背景及资源: 之前本来一直在写spring源码解析这块,如下,aop部分刚好写完.以前零散看过一些文章,知道rpc调用基本就是使用动态代理,比如rmi,dubbo,feign调用等.自己也就想着试 ...
- asyncio在爬虫中的使用
# -*- coding: utf-8 -*- # 协程基础.py import asyncio import time async def request(url): print("正在请 ...
- ui自动化chrome文件上传操作
web自动化,再chrome浏览器中文件上传操作
- pytorch里一些函数的说明记录
THLongStorage *THTensor_(newSizeOf)(THTensor *self); THLongStorage *THTensor_(newStrideOf)(THTensor ...
- 面向对象第四单元(UML)及期末总结
前言 统一建模语言(英语:Unified Modeling Language,缩写 UML),是软件架构设计建模和规约的语言. 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功 ...
- (11)nc命令(每周一个linux命令)
nc(netcat)实用程序几乎可用于所有涉及TCP或UDP的事情.它可以打开TCP连接,发送UDP数据包,监听任意TCP和UDP端口,进行端口扫描,处理IPv4和IPv6.与telnet不同,nc可 ...