Enable*

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

Enable*工作原理

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

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

  1. @Target(ElementType.TYPE)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Import(SchedulingConfiguration.class)

  4. @Documented

  5. public @interface EnableScheduling {

  6. }

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

@Import(SchedulingConfiguration.class)

@Import用法

来看看Import的源码

  1. @Target(ElementType.TYPE)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

  4. public @interface Import {

  5.    /**

  6.     * {@link Configuration}, {@link ImportSelector}, {@link ImportBeanDefinitionRegistrar}

  7.     * or regular component classes to import.

  8.     */

  9.    Class<?>[] value();

  10. }

1、Configuration

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

2、ImportSelector

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

  1. @Target(ElementType.TYPE)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

  4. @Import(AsyncConfigurationSelector.class)

  5. public @interface EnableAsync {

  1. public class AsyncConfigurationSelector extends AdviceModeImportSelector<EnableAsync> {

  2.    private static final String ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME =

  3.            "org.springframework.scheduling.aspectj.AspectJAsyncConfiguration";

  4.    /**

  5.     * {@inheritDoc}

  6.     * @return {@link ProxyAsyncConfiguration} or {@code AspectJAsyncConfiguration} for

  7.     * {@code PROXY} and {@code ASPECTJ} values of {@link EnableAsync#mode()}, respectively

  8.     */

  9.    @Override

  10.    public String[] selectImports(AdviceMode adviceMode) {

  11.        switch (adviceMode) {

  12.            case PROXY:

  13.                return new String[] { ProxyAsyncConfiguration.class.getName() };

  14.            case ASPECTJ:

  15.                return new String[] { ASYNC_EXECUTION_ASPECT_CONFIGURATION_CLASS_NAME };

  16.            default:

  17.                return null;

  18.        }

  19.    }

  20. }

3、ImportBeanDefinitionRegistrar

动态注册Bean,参考@EnableAspectJAutoProxy

  1. @Target(ElementType.TYPE)

  2. @Retention(RetentionPolicy.RUNTIME)

  3. @Documented

  4. @Import(AspectJAutoProxyRegistrar.class)

  5. public @interface EnableAspectJAutoProxy {

  1. class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {

  2.    /**

  3.     * Register, escalate, and configure the AspectJ auto proxy creator based on the value

  4.     * of the @{@link EnableAspectJAutoProxy#proxyTargetClass()} attribute on the importing

  5.     * {@code @Configuration} class.

  6.     */

  7.    @Override

  8.    public void registerBeanDefinitions(

  9.            AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

  10.        AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);

  11.        AnnotationAttributes enableAspectJAutoProxy =

  12.                AnnotationConfigUtils.attributesFor(importingClassMetadata, EnableAspectJAutoProxy.class);

  13.        if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {

  14.            AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);

  15.        }

  16.        if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {

  17.            AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);

  18.        }

  19.    }

  20. }

Spring Enable*高级应用及原理的更多相关文章

  1. Spring Enable高级应用及原理

    Enable* 之前的文章用到了一些Enable*开头的注解,比如EnableAsync.EnableScheduling.EnableAspectJAutoProxy.EnableCaching等, ...

  2. 【转】Spring学习---Spring IoC容器的核心原理

    [原文] Spring的两个核心概念:IoC和AOP的雏形,Spring的历史变迁和如今的生态帝国. IoC和DI的基本概念 IoC(控制反转,英文含义:Inverse of Control)是Spr ...

  3. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...

  4. spring boot 自动装配的原理

    参考: https://blog.csdn.net/Dongguabai/article/details/80865599.如有侵权,请联系本人删除! 入口: import org.springfra ...

  5. Spring读取xml配置文件的原理与实现

    本篇博文的目录: 一:前言 二:spring的配置文件 三:依赖的第三方库.使用技术.代码布局 四:Document实现 五:获取Element的实现 六:解析Element元素 七:Bean创造器 ...

  6. Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程

    spring-aop-4.3.7.RELEASE  在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...

  7. Spring Boot 文件上传原理

    首先我们要知道什么是Spring Boot,这里简单说一下,Spring Boot可以看作是一个框架中的框架--->集成了各种框架,像security.jpa.data.cloud等等,它无须关 ...

  8. Spring系列之IOC的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 导语 Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架.也是几乎所有J ...

  9. Spring系列之DI的原理及手动实现

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 前言 在上一章中,我们介绍和简单实现了容器的部分功能,但是这里还留下了很多的问题.比如我们在构造bean实例的时 ...

随机推荐

  1. grunt入门讲解7:项目脚手架grunt-init

    grunt-init是一个用于自动创建项目脚手架的工具.它会基于当前工作环境和你给出的一些配置选项构建一个完整的目录结构.至于其所生成的具体文件和内容,依赖于你所选择的模版和构建过程中你对具体信息所给 ...

  2. grunt入门讲解5:创建插件,安装Grunt以及常见问题

    创建插件 创建插件主要有以下几个步骤: (1)通过 npm install -g grunt-init 命令安装 grunt-init .(2)通过 git clone git://github.co ...

  3. Scrum 项目准备5.0

    1.团队成员完成自己认领的任务. 2.燃尽图:理解.设计并画出本次Sprint的燃尽图的理想线.参考图6. 3.每日立会更新任务板上任务完成情况.燃尽图的实际线,分析项目进度是否在正轨.    每天的 ...

  4. PHP开发网站,你是如何提高其网站的安全性的?

    一.网站程序问题 很多网站的安全问题大多是由于网站程序存在漏洞,所以想要提高网站安全性,必须要选择安全的后台cms系统,若有能力可以自己去开发网站后台,这样安全性能得到极大的提高,若是从网上选择一些免 ...

  5. matlab for 运算的提速

    [1]主要思想:matlab是按列存储,定义s(nums,1)比定义s(1,nums)要快哦                       需要重复query的元素看看能不能再for之前就定义好 经典案 ...

  6. JVM内存管理机制

    Java与C++之间有一堆由内存动态分配与垃圾收集技术所围成的“高墙”,墙外面的人想进去,墙里面的人却想出来. —— <深入理解Java虚拟机:JVM高级特性与最佳实践> Java虚拟机在 ...

  7. HDU3046_Pleasant sheep and big big wolf

    给一个n*m的数字阵,1表示羊的位置,2表示狼的位置,0表示没有东西,可以通过.在每个格子的4边都可以建立围栏,有围栏的话狼是不能通过的. 现在求最少建立多少围栏能够保证狼无法接触到羊. 题目的模型很 ...

  8. Robot Framework 的安装配置和简单的实例介绍

    Robot Framework 介绍 Robot Framework 是一款基于 Python 的功能自动化测试框架.它具备良好的可扩展性,支持关键字驱动,可以同时测试多种类型的客户端或者接口,可以进 ...

  9. Access数据库通过ODBC导出到Oracle的两个小问题ora-24801\Ora-01401

    问题描述:从access通过odbc导出到oracle出现  ora-24801  非法值 错误  与  Ora-01401 值过大的错误 问题分析:access里面的字段类型为“备注”,导入到ora ...

  10. 【题解】JSOI2009球队收益 / 球队预算

    为什么大家都不写把输的场次增加的呢?我一定要让大家知道,这并没有什么关系~所以 \(C[i] <= D[i]\) 的条件就是来卖萌哒?? #include <bits/stdc++.h&g ...