【Spring】Spring高級話題-@Enable***注解的工作原理

@EnableAspectJAutoProxy

?

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

?

@EnableAspectJAutoProxy注解 激活Aspect自動代理

 <aop:aspectj-autoproxy/>
  • 1

開啟對AspectJ自動代理的支持。

在用到AOP的自動代理的時候用,如果你理解了Java的動態代理,很容易的就會熟悉AOP的自動代理的。

@EnableAsync

@EnableAsync注解開啟異步方法的支持。?
這個相信大家都比較熟悉的。對于異步應該都理解的。?
不太熟悉的,可以看這篇博客:-有示例?
【Spring】Spring高級話題-多線程-TaskExecutor

@EnableScheduling

@EnableScheduling注解開啟計劃任務的支持。

也就是字面上的意思,開啟計劃任務的支持!?
一般都需要@Scheduled注解的配合。

詳情見此博客:?
【Spring】Spring高級話題-計劃任務-@EnableScheduling

@EnableWebMVC

@EnableWebMVC注解用來開啟Web MVC的配置支持。

也就是寫Spring MVC時的時候會用到。

@EnableConfigurationProperties

@EnableConfigurationProperties注解是用來開啟對@ConfigurationProperties注解配置Bean的支持。

也就是@EnableConfigurationProperties注解告訴Spring Boot 使能支持@ConfigurationProperties

@EnableJpaRepositories

@EnableJpaRepositories注解開啟對Spring Data JPA Repostory的支持。

Spring Data JPA 框架,主要針對的就是 Spring 唯一沒有簡化到的業務邏輯代碼,至此,開發者連僅剩的實現持久層業務邏輯的工作都省了,唯一要做的,就只是聲明持久層的接口,其他都交給 Spring Data JPA 來幫你完成!

簡單的說,Spring Data JPA是用來持久化數據的框架。

@EnableTransactionManagement

@EnableTransactionManagement注解開啟注解式事務的支持。

注解@EnableTransactionManagement通知Spring,@Transactional注解的類被事務的切面包圍。這樣@Transactional就可以使用了。

@EnableCaching

@EnableCaching注解開啟注解式的緩存支持

通過這些簡單的@Enable*可以開啟一項功能的支持,從而避免自己配置大量的代碼,很大程度上降低了使用難度。

我們一起來觀察下這些@Enable*注解的源碼,可以發現所有的注解都有一個@Import注解。

@Import注解是用來導入配置類的,這也就是說這些自動開啟的實現其實是導入了一些自動配置的Bean。

這些導入配置方式主要分為以下三種類型。

@Import注解導入配置方式的三種類型

第一類:直接導入配置類

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//package org.springframework.scheduling.annotation;import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Import;
import org.springframework.scheduling.annotation.SchedulingConfiguration;@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling {
}
  • ?

直接導入配置類SchedulingConfiguration,這個類注解了@Configuration,且注冊了一個scheduledAnnotationProcessor的Bean,源碼如下:

/** Copyright 2002-2015 the original author or authors.** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/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} 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();}}
  • ?

第二類:依據條件選擇配置類

EnableAsync 注解核心代碼:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AsyncConfigurationSelector.class)
public @interface EnableAsync {Class<? extends Annotation> annotation() default Annotation.class;boolean proxyTargetClass() default false;AdviceMode mode() default AdviceMode.PROXY;int order() default Ordered.LOWEST_PRECEDENCE;}
ublic 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;}}}
  • ?

第三類:動態注冊Bean

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {boolean proxyTargetClass() default false;
}
  • ?

本文章由[諳憶]編寫, 所有權利保留。

轉載請注明出處:http://blog.csdn.net/qq_26525215

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/450308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/450308.shtml
英文地址,請注明出處:http://en.pswp.cn/news/450308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IDEA項目找不到瀏覽器報錯的情況

調tomcat的時候&#xff0c;它會調用瀏覽器&#xff0c;瀏覽器關聯如果有問題&#xff0c;肯定是會報錯的 要是測試的時候&#xff0c;就是瀏覽器的問題&#xff0c;重新把瀏覽器裝一遍讓他自己重新關聯一下應該就行了轉載于:https://www.cnblogs.com/Koma-vv/p/10156478.html

c/c++經典面試試題及標準答案

下面的問題我想大部分c/c 程序員 都遇見過.如果沒有看過&#xff0c;草根IT特別推薦一下。 一、請填寫BOOL , float, 指針變量與“零值”比較的 if 語句。&#xff08;10分&#xff09;請寫出 BOOL flag 與“零值”比較的 if 語句。&#xff08;3分&#xff09;標準答案&#x…

微服務拆分

微服務拆分是做微服務架構很重要也很難的話題&#xff0c;很多時候&#xff0c;幾個服務是合還是拆在設計團隊內也很難達成共識。 當你糾結應該拆分和合并時我建議就先合并&#xff0c;等后面版本迭代需要時有必要再去做拆分。從系統發展的角度說&#xff0c;很多平臺也都是從單…

oracle數據庫學習筆記

字符函數是ORACLE中最常用的函數: Lower(char):將字符串轉化為小寫格式 Upper(char):將字符轉化為大寫的格式 Length(char):返回字符串的長度 Substr(char,m,n):取字符串的子串 Trim,Ltrim,Rtrim:去掉空格 dual 虛表 當沒有表可以用的時候 就用虛表 as 當做 可以理解為別…

并發編程-concurrent指南-線程池ExecutorService的使用

有幾種不同的方式來將任務委托給 ExecutorService 去執行&#xff1a; execute(Runnable)submit(Runnable)submit(Callable)invokeAny(…)invokeAll(…)execute(Runnable) execute(Runnable) 方法要求一個 java.lang.Runnable 對象&#xff0c;然后對它進行異步執行。以下是使用…

怎樣去理解@ComponentScan注解

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 怎么樣去理解它呢&#xff1f; 1.配置視圖控制器 [java] view plain copy package com.apress.prospringmvc.bookstore.web.config; imp…

oracle 如何創建序列squence

create sequence 序列名 start with 1 increment by 1 nomaxvalue nominvalue nocycle nocache;

如何高效、可移植申請內存代碼。

在視頻編解碼中&#xff0c;如何申請char mem_2D[1920][1080], char mem_3D[4][1920][1080], char mem_4D[6][4][1920][1080]&#xff0c;高效 又 可移植申請內存呢&#xff1f; 請看如下代碼&#xff1a; 看完后&#xff0c;如要申請的是 int &#xff0c;不是cha…

CSS中的px與物理像素、邏輯像素、1px邊框問題

一直不太清楚CSS中的1px與邏輯像素、物理像素是個什么關系&#xff08;作為一名前端感覺很慚愧 -_-&#xff01;&#xff09;&#xff0c;今天終于花時間徹底弄清楚了&#xff0c;其實弄清楚之后就覺得事情很簡單&#xff0c;但也只有在弄清楚之后&#xff0c;才會覺得簡單&…

平滑數據遷移,不影響服務

為什么80%的碼農都做不了架構師&#xff1f;>>> 轉自&#xff1a;http://www.10tiao.com/html/249/201703/2651959992/1.html 轉載于:https://my.oschina.net/jzgycq/blog/2872104

spring cache相關注解介紹 @Cacheable、@CachePut、@CacheEvict

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Cacheable是用來聲明方法是可緩存的。將結果存儲到緩存中以便后續使用相同參數調用時不需執行實際的方法。直接從緩存中取值。最簡單的格…

layui 渲染select下拉選項 ,日期控件的用法

最近項目中用到關于layui的前端技術&#xff0c;在使用layui 渲染select option下拉復選框時出現了沒有值渲染的問題&#xff0c;還有使用layui日期的過程 &#xff0c;接下來就一起看看吧。 /** *從后臺渲染字段民族數據/<div class"layui-inline"><labe…

CF1082G Petya and Graph(最小割,最大權閉合子圖)

QWQ嚶嚶嚶 感覺是最水的一道\(G\)題了 順便記錄一下第一次在考場上做出來G qwqqq 題目大意就是說&#xff1a; 給你n個點&#xff0c;m條邊&#xff0c;讓你選出來一些邊&#xff0c;最大化邊權減點權 \(n\le 1000\) QWQ 看完這個題和數據范圍&#xff0c;第一感覺就是網絡流啊…

NET Core微服務之路:讓我們對上一個Demo通訊進行修改,完成RPC通訊

最近一段時間有些事情耽擱了更新&#xff0c;抱歉各位了。上一篇我們簡單的介紹了DotNetty通信框架&#xff0c;并簡單的介紹了基于DotNetty實現了回路&#xff08;Echo&#xff09;通信過程。我們來回憶一下上一個項目的整個流程&#xff1a;當服務端啟動后&#xff0c;綁定并…

Centos7防火墻設置

查看防火墻狀態 or rootlocalhost ~]# systemctl status firewalld / firewall-cmd --state 啟動防火墻 [rootlocalhost ~]# systemctl start firewalld 關閉防火墻 [rootlocalhost ~]# systemctl stop firewalld 設置開機啟動 [rootlocalhost ~]# systemctl enable fi…

HTTP協議中POST、GET、HEAD、PUT等請求方法及相應值得含義

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 請求方法是請求一定的Web頁面的程序或用于特定的URL。可選用下列幾種&#xff1a; GET&#xff1a; 請求指定的頁面信息&#xff0c;并…

java面試題文檔(QA)

– 基礎篇 1、 Java語言有哪些特點2、面向對象和面向過程的區別3 、八種基本數據類型的大小&#xff0c;以及他們的封裝類4、標識符的命名規則。5、instanceof 關鍵字的作用6、Java自動裝箱與拆箱7、 重載和重寫的區別8、 equals與的區別9、 Hashcode的作用10、String、String …

第四次軟件工程作業

關于 石墨文檔客戶端 的案例分析 作業地址&#xff1a; https://edu.cnblogs.com/campus/nenu/2016CS/homework/2505 第一部分 調研&#xff0c; 評測 1.下載并使用&#xff0c;按照描述的bug定義&#xff0c;找3~5個功能性的比較嚴重的bug。請用專業的語言描述&#xff08;每個…

深入剖析C++中的string類

一&#xff0c;C語言的字符串 在C語言里&#xff0c;對字符串的處理一項都是一件比較痛苦的事情&#xff0c;因為通常在實現字符串的操作的時候都會用到最不容易駕馭的類型——指針。 比如下面這個例子&#xff1a; //example 1: char str[12] "Hello"; char *…

Apple System: Error: ENFILE: file table overflow

2019獨角獸企業重金招聘Python工程師標準>>> 在MAC上跑nodejs&#xff0c;遇到了一個問題&#xff1a;file table overflow 主要意思就是說文件打開太多了&#xff0c;超過了限制&#xff0c;產生這個問題主要是蘋果操作系統的限制。 echo kern.maxfiles65536 | sud…