Spring Enable*高级应用及原理

转载自 Spring Enable*高级应用及原理

 

Enable*

之前的文章用到了一些Enable*开头的注解,比如EnableAsync、EnableScheduling、EnableAspectJAutoProxy、EnableCaching等,Enable表示开启/允许一项功能。

Enable*工作原理

我们只需要几个很简单的注解就能开启一个复杂的功能,这是多么简易的用法,这是怎么办到的?

首先来看看计划任务@EnableScheduling的源代码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {}

主要核心的配置就是导入了一个配置文件,所以谜底也就接开了。

@Import(SchedulingConfiguration.class)

@Import用法

来看看Import的源码

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Import {/*** {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}* or regular component classes to import.*/Class<?>[] value();}

1、Configuration

即上面的用法,直接导入Configuration配置类。

2、ImportSelector

根据条件选择导入不同的配置类,参考@EnableAsync

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {
public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME ="org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";/*** {@inheritDoc}* @return {@link ProxyAsyncConfiguration} or {@code AspectJAsyncConfiguration} for* {@code PROXY} and {@code ASPECTJ} values of {@link EnableAsync#mode()}, respectively*/@Overridepublic String[] selectImports(AdviceMode adviceMode) {switch (adviceMode) {case PROXY:return new String[] { ProxyAsyncConfiguration.class.getName() };case ASPECTJ:return new String[] { ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME };default:return null;}}}

3、ImportBeanDefinitionRegistrar

动态注册Bean,参考@EnableAspectJAutoProxy

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {/*** Register, escalate, and configure the AspectJ auto proxy creator based on the value* of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing* {@code @Configuration} class.*/@Overridepublic void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);AnnotationAttributes enableAspectJAutoProxy =AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);}if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);}}}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACM训练题7

计算球体积 Problem Description 根据输入半径输出球的体积 INPUT 输入数据有多组&#xff0c;每组占一行&#xff0c;每行包括一个实数&#xff0c;表示球的半径。 OUTPUT 输出对应的球的体积&#xff0c;对于每组输入数据&#xff0c;输出一行&#xff0c;计算结果保留…

JSON与JS对象的区别

和一些同学一样&#xff1a;总是感觉json对象(其实json不是对象)和js对象的字面量表示法相同&#xff0c;最近学习json&#xff0c;真心搞不懂&#xff0c;js对象和json有什么区别&#xff1f;就是感觉json的key要用” “括起来&#xff0c;但是js对象的字面量表示法不需要。  …

Spring Boot开启的2种方式

转载自 Spring Boot开启的2种方式Spring Boot依赖 使用Spring Boot很简单&#xff0c;先添加基础依赖包&#xff0c;有以下两种方式 1. 继承spring-boot-starter-parent项目 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-b…

JSON | JSON字符串和JSON对象的区别

最近在学习Vue.js&#xff0c;里面有个存储、读取本地缓存的功能&#xff0c;不停地用JSON.parse()&#xff0c;和JSON.stringify()来转换JSON字符串和JSON对象。自己有点晕&#xff0c;不明白两者的区别&#xff0c;看起来感觉是一样的&#xff0c;也不知道为什么一定要转换才…

Spring Boot Starters启动器

转载自 Spring Boot Starters启动器 Starters是什么&#xff1f; Starters可以理解为启动器&#xff0c;它包含了一系列可以集成到应用里面的依赖包&#xff0c;你可以一站式集成Spring及其他技术&#xff0c;而不需要到处找示例代码和依赖包。如你想使用Spring JPA访问数据库&…

数列有序

Promble Description 有n(n<100)个整数&#xff0c;已经按照从小到大顺序排列好&#xff0c;现在另外给一个整数x&#xff0c;请将该数插入到序列中&#xff0c;并使新的序列仍然有序。 INPUT 输入数据包含多个测试实例&#xff0c;每组数据由两行组成&#xff0c;第一行…

Spring Boot自动配置原理、实战

转载自 Spring Boot自动配置原理、实战 Spring Boot自动配置原理 Spring Boot的自动配置注解是EnableAutoConfiguration&#xff0c;从上面的Import的类可以找到下面自动加载自动配置的映射。 org.springframework.core.io.support.SpringFactoriesLoader.loadFactoryNames(Cla…

ES6 Map对象的使用

转自&#xff1a; https://blog.csdn.net/u012664198/article/details/97373751 Map对象保存键值对,任何值(对象或者原始值) 都可以作为一个键或一个值 key和value可以是字符串等数据类型&#xff0c;也可以是对象&#xff0c;函数&#xff0c;NaN。 set&#xff1a;insert ke…

水仙花数

Problem Description 春天是鲜花的季节&#xff0c;水仙花就是其中最迷人的代表&#xff0c;数学上有个水仙花数&#xff0c;他是这样定义的&#xff1a; “水仙花数”是指一个三位数&#xff0c;它的各位数字的立方和等于其本身&#xff0c;比如&#xff1a;1531^35^33^3。 现…

JDBC元数据操作(一)-- DatabaseMetaData接口详解

转自&#xff1a; https://blog.csdn.net/chen_zw/article/details/18816599 1. 前言 在JDBC技术规范中&#xff0c;提供了Connection&#xff0c;Statement,ResultSet这三个开发过程中经常用到的接口。针对与每个接口&#xff0c;JDBC规范提供了相应的接口描述对象&#…

Spring Boot核心配置

转载自 Spring Boot核心配置 启动类 在包根目录下添加启动类&#xff0c;必须包含main方法&#xff0c;再添加Spring Boot启动方法&#xff1a; SpringApplication.run(SampleController.class, args); 或者流式API new SpringApplicationBuilder().run(args); 下面是一个典型的…

空心三角形

Problem Description 把一个字符三角形掏空&#xff0c;就能节省材料成本&#xff0c;减轻重量&#xff0c;但关键是为了追求另一种视觉效果。在设计的过程中&#xff0c;需要给出各种花纹的材料和大小尺寸的三角形样板&#xff0c;通过电脑临时做出来&#xff0c;以便看看效…

Dom4j完整教程详解

转自&#xff1a; https://blog.csdn.net/qq_41860497/article/details/84339091 目录 1、DOM4J简介 2、XML文档操作1 2.1、读取XML文档&#xff1a; 2.2、获取根节点 2.3、. 新增一个节点以及其下的子节点与数据 2.4、 写入XML文件 2. 5、 遍历xml节点 2.6、创建xml文件 2.…

Spring Boot功能实战

转载自 Spring Boot功能实战 添加web功能启动器 添加了Spring Boot基础依赖后&#xff0c;如要使用web mvc功能&#xff0c;只需要添加如下启动器即可&#xff0c;Spring Boot会自动装配web功能。 <dependencies><dependency><groupId>org.springframework.b…

scanf用法总结

转载自&#xff1a;http://blog.csdn.net/21aspnet/article/details/174326函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,…]);scanf()函数是通用终端格式化输入函数&#xff0c;它从标准输入设备(键盘) 读取输入的信息。可以读入任何固有类…

Spring Boot Runner启动器

转载自 Spring Boot Runner启动器 Runner启动器 如果你想在Spring Boot启动的时候运行一些特定的代码&#xff0c;你可以实现接口 ApplicationRunner或者 CommandLineRunner&#xff0c;这两个接口实现方式一样&#xff0c;它们都只提供了一个run方法。 CommandLineRunner&…

spring的PathMatchingResourcePatternResolver基于ant通配符匹配路径遍历项目所有xml文件

【1】代码 public class MybatisTest9_spring {/*** 遍历所有xml文件 */Test public void dom4j_test2() { System.out.println("dom4j_test2"); ResourcePatternResolver loader new PathMatchingResourcePatternResolver();try {Resource[] resources loader.…

Spring Cloud是什么,和Dubbo对比呢?

转载自 Spring Cloud是什么&#xff0c;和Dubbo对比呢&#xff1f; 简介 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发&#xff0c;如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等&#xff0c…

think-in-java(21)并发

【README】 并发后半部分&#xff08;并发2&#xff0c;从21.4.3中断开始&#xff09;参见&#xff1a; https://blog.csdn.net/PacosonSWJTU/article/details/106878087 ; 本文章包括了并发1和并发2 &#xff0c;期初新建并发2是为了方便编写文档&#xff0c;因为并发内容实…

POJ3904(dfs)

Promble Description 定义一个二维数组&#xff1a; int maze[5][5] {0, 1, 0, 0, 0,0, 1, 0, 1, 0,0, 0, 0, 0, 0,0, 1, 1, 1, 0,0, 0, 0, 1, 0,}; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜…