@Enable***註解的原理與使用
摘要:我們在開發中,會經常用到@Enable***開頭的這種註解,來自動匯入一些框架配置的預設的bean,進入註解原始碼,會發現這些註解類上都會有一個@Import(****.class)註解,這些註解是怎麼實現的呢?
Import匯入,又分為三種方式,分別為:
1.直接匯入配置類
2.根據條件選擇配置類
3.動態註冊Bean
下面,通過示例,進入原始碼,分析一下這三種匯入方式:
1.直接匯入配置類
以@EnableScheduling為例,看原始碼:
發現有@Import匯入了一個SchedulingConfiguration類,我們追一下原始碼:@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling { }
解讀一下注釋,看看此類的作用:package org.springframework.scheduling.annotation; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Role; import org.springframework.scheduling.config.TaskManagementConfigUtils; /** * {@code @Configuration} class that registers a {@link ScheduledAnnotationBeanPostProcessor} * bean capable of processing Spring's @{@link Scheduled} annotation. * * <p>This configuration class is automatically imported when using the * {@link EnableScheduling @EnableScheduling} annotation. See * {@code @EnableScheduling}'s javadoc for complete usage details. * * @author Chris Beams * @since 3.1 * @see EnableScheduling * @see ScheduledAnnotationBeanPostProcessor */ @Configuration @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public class SchedulingConfiguration { @Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME) @Role(BeanDefinition.ROLE_INFRASTRUCTURE) public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() { return new ScheduledAnnotationBeanPostProcessor(); } }
為@Scheduled註解註冊一個能被spring管理的名為:ScheduledAnnotationBeanPostProcessor的bean,當使用@EnableScheduling註解時,這個註解類會自動被匯入。
2.根據條件選擇配置類
以@EnableAsync註解為例,看原始碼:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AsyncConfigurationSelector.class) public @interface EnableAsync {省略....}
發現有@Import匯入了一個AsyncConfigurationSelector類,我們追一下原始碼:
package org.springframework.scheduling.annotation;
import org.springframework.context.annotation.AdviceMode;
import org.springframework.context.annotation.AdviceModeImportSelector;
/**
* Selects which implementation of {@link AbstractAsyncConfiguration} should be used based
* on the value of {@link EnableAsync#mode} on the importing {@code @Configuration} class.
*
* @author Chris Beams
* @since 3.1
* @see EnableAsync
* @see ProxyAsyncConfiguration
*/
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
*/
@Override
public 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;
}
}
}
這個類的父父類是ImportSelector,其實是一個選擇器,這個ImportSelector介面中只有一個方法String[] selectImports(AnnotationMetadata importingClassMetadata);
AsyncConfigurationSelector類中重寫了這個選擇方法,根據不同的引數(adviceMode,我理解為框架建議的型別),會返回不同的配置類:
若adviceMode為PORXY,則返回ProxyAsyncConfiguration這個配置類。
若activeMode為ASPECTJ,則返回AspectJAsyncConfiguration配置類。
3.動態註冊Bean
以@EnableAspectJAutoProxy為例,檢視原始碼:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
/**
* Indicate whether subclass-based (CGLIB) proxies are to be created as opposed
* to standard Java interface-based proxies. The default is {@code false}.
*/
boolean proxyTargetClass() default false;
/**
* Indicate that the proxy should be exposed by the AOP framework as a {@code ThreadLocal}
* for retrieval via the {@link org.springframework.aop.framework.AopContext} class.
* Off by default, i.e. no guarantees that {@code AopContext} access will work.
* @since 4.3.1
*/
boolean exposeProxy() default false;
}
此類匯入了AspectJAutoProxyRegistrar類,這個類實現了父類的registerBeanDefinitions()方法,此方法根據給定的註解定義來動態註冊bean。[email protected]原始碼分析
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Configuration {
/**
* Explicitly specify the name of the Spring bean definition associated
* with this Configuration class. If left unspecified (the common case),
* a bean name will be automatically generated.
* <p>The custom name applies only if the Configuration class is picked up via
* component scanning or supplied directly to a {@link AnnotationConfigApplicationContext}.
* If the Configuration class is registered as a traditional XML bean definition,
* the name/id of the bean element will take precedence.
* @return the suggested component name, if any (or empty String otherwise)
* @see org.springframework.beans.factory.support.DefaultBeanNameGenerator
*/
String value() default "";
}
@Configuration註解的原始碼中其實是沒什麼內容的。我們看一下這段註解的意思:
顯示的指定配置檔案中定義的spring bean的名字,一般情況下,如果未顯示的指明,將會自動生成一個bean的名字;
自定義名稱,僅在配置類通過元件掃描或者由程式上下文直接給出時,才可以使用;
如果配置類是以xml的形式定義的,那xml中定義的bean名字將優先起作用;
此介面將會返回框架建議的元件名稱,如果有的話,否則返回空字串。
5.常用註解
@EnableAspectJAutoProxy
@EnableAspectJAutoProxy註解 啟用Aspect自動代理,開啟對AspectJ自動代理的支援。
@EnableAsync
@EnableAsync註解開啟非同步方法的支援。
@EnableScheduling
@EnableScheduling註解開啟計劃任務的支援。
@EnableWebMVC
@EnableWebMVC註解用來開啟Web MVC的配置支援,也就是寫Spring MVC時的時候會用到。
@EnableConfigurationProperties
@EnableConfigurationProperties註解是用來開啟對@ConfigurationProperties註解配置Bean的支援。
@EnableJpaRepositories
@EnableJpaRepositories註解開啟對Spring Data JPA Repostory的支援。
@EnableTransactionManagement
@EnableTransactionManagement註解開啟註解式事務的支援,註解@EnableTransactionManagement通知Spring,@Transactional註解的類被事務的切面包圍。這樣@Transactional就可以使用了。
@EnableCaching
@EnableCaching註解開啟註解式的快取支援
相關推薦
SpringBoot5-spring高階話題-組合註解與元註解,@Enable*註解的工作原理,測試
一:組合註解與元註解 從spring2開始,為了響應JDK1.5推出的註解供暖,spring開始大量加入註解來替代xml配置。spring的註解主要用來配置和注入bean,以及AOP相關的配置(@Transactional)。隨著註解的大量使用,尤其相同的多個註
@Enable***註解的原理與使用
摘要:我們在開發中,會經常用到@Enable***開頭的這種註解,來自動匯入一些框架配置的預設的bean,進入註解原始碼,會發現這些註解類上都會有一個@Import(****.class)註解,這些註解是怎麼實現的呢? Import匯入,又分為三種方式,分別為: 1.直接匯
@Enable*註解的原理
觀察 new oot port mvcc doc run 所有 async 在SpringBoot中,[email protected]/* */*註解的方式來開啟。 [email protected]/* */ [email protec
007-Spring Boot @Enable*註解的工作原理
sync express override factor run ext soft navi itself 一、@Enable* 啟用某個特性的註解 1、EnableConfigurationProperties 回顧屬性裝配 application.properti
@Enable*註解的工作原理
eas ans prop rep proxy ati ransac repo auto @EnableAspectJAutoProxy @EnableAsync @EnableScheduling @EnableWebMv @EnableConfigurationPrope
springBoot @Enable*註解的工作原理
圖解 tor def sys autoconf 屬性註入 erb ota efi 使用註解實現異步 RunnableDemo類 package com.boot.enable.bootenable; import org.springframework.schedu
Spring 之 Enable* 註解的工作原理
通過簡單的@Enable* 來開啟一項功能的支援,從而避免自己配置大量的程式碼降低使用的難度. 通過觀察@Enable*註解的原始碼,發現所有的註解都有一個@Import註解,它是用來匯入配置類的,這也就意味著這些自動開啟的實現其實是匯入了一些自動配置的 bean,
Spring Boot @Enable*註解工作原理
一、讀取配置檔案 --application.properties tomcat.host=192.168.1.1 tomcat.port=8080 package vip.fkandy.model; import org.springframework.boot.context.pr
Spring註解的原理與自定義註解的實現
本文只是用於記錄個人在學習annotation過程中的心德,所以知識面不太完善。 1、註解的基本概念 Java 的annotation提供的是一種類似於註釋的機制,註解本身不做任何事,好比一個配置或者說一個標記。用於包、型別、構造方法、方法、成員變數、引數及本地變數
第十三章 @Enable*註解的工作原理
在前面的章節中,我們使用了 @EnableAspectJAutoProxy開啟對AspectJ自動代理的支援 @EnableAsync開啟非同步方法的支援 @EnableScheduling開啟計劃任務的支援 通過簡單的@Enable*來
Spring註解原理的詳細剖析與實現
一、註解的基本概念和原理及其簡單實用 註解(Annotation)提供了一種安全的類似註釋的機制,為我們在程式碼中新增資訊提供了一種形式化得方法,使我們可以在稍後某個時刻方便的使用這些資料(通過解析註解來使用這些資料),用來將任何的資訊或者元資料與程式元素(類、方法、成員變
SpringBoot的@Enable* 註解的工作原理
SpringBoot 提供了@EnableAutoConfiguration、@EnableConfigurationProperties、@EnableAsync等註解用來啟用某些特性。 工作原理 每個以 Enable 開頭的註解中,都
spring學習--12 @Enable*註解工作原理
所有@Enable*已經註解的元註解中均包含@Import註解,@Import用於匯入配置類,因此@Enable*註解通過匯入配置類實現*所標註功能的使能。如@EnableAsync、@EnableScheduling、@EnableAspectJAutoPro
註解Annotation實現原理與自定義註解例子
什麼是註解? 對於很多初次接觸的開發者來說應該都有這個疑問?Annontation是Java5開始引入的新特徵,中文名稱叫
深入理解@LoadBalanced註解的實現原理與客戶端負載均衡
前提 在閱讀這篇部落格之前,希望你對SpringCloud套件熟悉和理解,更希望關注下微服務開發平臺 概述 在使用springcloud ribbon客戶端負載均衡的時候,可以給RestTemplate bean 加一個@LoadBalanced註解,就能讓這個RestTemplate在請求時擁有客戶端負載均
springboot2.x基礎教程:自動裝配原理與條件註解
> spring Boot採用約定優於配置的方式,大量的減少了配置檔案的使用。該框架使用了特定的方式來進行配置,從而使開發人員不再需要定義樣板化的配置。 > 當springboot啟動的時候,預設在容器中注入許多AutoCongfigution類。在我們加入spring-boot-stareter
《大型網站技術架構:核心原理與案例分析》-- 讀書筆記 (5) :網購秒殺系統
案例 並發 刷新 隨機 url 對策 -- 技術 動態生成 1. 秒殺活動的技術挑戰及應對策略 1.1 對現有網站業務造成沖擊 秒殺活動具有時間短,並發訪問量大的特點,必然會對現有業務造成沖擊。對策:秒殺系統獨立部署 1.2 高並發下的應用、
Java 線程池的原理與實現
控制 try 所在 使用 urn str waiting media .info 這幾天主要是狂看源程序,在彌補了一些曾經知識空白的同一時候,也學會了不少新的知識(比方 NIO)。或者稱為新技術吧。 線程池就是當中之中的一個,一提到線程。我們會想到曾經《操作系統》的
簡單科普下hosts文件原理與制作
div ace 做了 upload strong 不能 測試 設置 pro 簡單科普下hosts文件原理與制作 hosts文件是一個用於儲存計算機網絡中各節點信息的計算機文件。這個文件負責將主機名映射到相應的IP地址。hosts文件通常用於補充或取代網絡中DNS的功能。
Atitit.angular.js 使用最佳實踐 原理與常見問題解決與列表顯示案例 attilax總結
依賴 實現 http dsi 概念 模板 style ctr net Atitit.angular.js 使用最佳實踐 原理與常見問題解決與列表顯示案例 attilax總結 1. 本文範圍 1 2. Angular的長處 1 2.1. 雙向數據綁定 1 2.2. d