Spring Enable*高级应用及原理
来源:互联网 发布:如何卖数据 编辑:程序博客网 时间:2024/06/09 20:57
Enable*
之前的文章用到了一些Enable*开头的注解,比如EnableAsync、EnableScheduling、EnableAspectJAutoProxy、EnableCaching等,Enable表示开启/允许一项功能。
Enable*工作原理
我们只需要几个很简单的注解就能开启一个复杂的功能,这是多么简易的用法,这是怎么办到的?
首先来看看计划任务@EnableScheduling的源代码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public@interfaceEnableScheduling{
}
主要核心的配置就是导入了一个配置文件,所以谜底也就接开了。
@Import(SchedulingConfiguration.class)
@Import用法
来看看Import的源码
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public@interfaceImport{
/**
* {@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@interfaceEnableAsync{
publicclassAsyncConfigurationSelectorextendsAdviceModeImportSelector{
privatestaticfinalStringASYNC_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
*/
@Override
publicString[]selectImports(AdviceModeadviceMode){
switch(adviceMode){
casePROXY:
returnnewString[]{ProxyAsyncConfiguration.class.getName()};
caseASPECTJ:
returnnewString[]{ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME};
default:
returnnull;
}
}
}
3、ImportBeanDefinitionRegistrar
动态注册Bean,参考@EnableAspectJAutoProxy
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public@interfaceEnableAspectJAutoProxy{
classAspectJAutoProxyRegistrarimplementsImportBeanDefinitionRegistrar{
/**
* 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.
*/
@Override
publicvoidregisterBeanDefinitions(
AnnotationMetadataimportingClassMetadata,BeanDefinitionRegistryregistry){
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
AnnotationAttributesenableAspectJAutoProxy=
AnnotationConfigUtils.attributesFor(importingClassMetadata,EnableAspectJAutoProxy.class);
if(enableAspectJAutoProxy.getBoolean("proxyTargetClass")){
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
if(enableAspectJAutoProxy.getBoolean("exposeProxy")){
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}
- Spring Enable*高级应用及原理
- 【Spring】Spring高级话题-@Enable***注解的工作原理
- 【Spring】Spring高级话题-@Enable***注解的工作原理
- Spring高级话题-@Enable***注解的工作原理
- SpringBoot5-spring高级话题-组合注解与元注解,@Enable*注解的工作原理,测试
- spring mvc 原理及应用
- spring mvc 原理及应用
- Spring AOP原理及简单应用
- Spring AOP原理及简单应用
- 5、spring之mvc原理及应用
- Spring AOP原理及简单应用
- Spring AOP原理及简单应用
- Spring AOP原理及简单应用
- Spring aop 原理及各种应用场景
- Spring aop 原理及各种应用场景
- Spring aop 原理及各种应用场景
- Spring aop 原理及各种应用场景
- Spring aop 原理及各种应用场景
- 初见CSDN
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink实战基础0010--flink分布式部署005
- XgBoost详解
- Maven发布jar包到Nexus私库
- Banner轮播图的简单使用
- Spring Enable*高级应用及原理
- Spring快速开启计划任务
- LUA基本语法二
- Spring开启方法异步执行
- Spring Aware容器感知技术
- Python机器学习库sklearn里利用LR模型进行三分类(多分类)的原理
- Java Map集合面试题汇总
- SaaS,PaaS,IaaS都是什么鬼?
- 终于,Spring 5.0正式发布了!