1. 程式人生 > >@Enable***註解的原理與使用

@Enable***註解的原理與使用

摘要:我們在開發中,會經常用到@Enable***開頭的這種註解,來自動匯入一些框架配置的預設的bean,進入註解原始碼,會發現這些註解類上都會有一個@Import(****.class)註解,這些註解是怎麼實現的呢?

Import匯入,又分為三種方式,分別為:

1.直接匯入配置類

2.根據條件選擇配置類

3.動態註冊Bean

下面,通過示例,進入原始碼,分析一下這三種匯入方式:

1.直接匯入配置類

以@EnableScheduling為例,看原始碼:

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

}
發現有@Import匯入了一個SchedulingConfiguration類,我們追一下原始碼:
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