最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring AOP與代理類的執(zhí)行順序級(jí)別淺析

 更新時(shí)間:2023年03月27日 10:35:09   作者:T.Y.Bao  
這篇文章主要介紹了Spring AOP與代理類的執(zhí)行順序級(jí)別,關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能

關(guān)于 Spring AOP和Aspectj的關(guān)系,兩個(gè)都實(shí)現(xiàn)了切面編程,Spring AOP更多地是為了Spring框架本身服務(wù)的,而Aspectj具有更強(qiáng)大、更完善的切面功能,我們?cè)趯憳I(yè)務(wù)時(shí)一般使用AspectJ。不過(guò)他們的概念、原理都差不多。

Spring AOP說(shuō):

the Spring Framework’s AOP functionality is normally used in conjunction with the Spring IoC container. Aspects are configured using normal bean definition syntax (although this allows powerful “autoproxying” capabilities): this is a crucial difference from other AOP implementations. There are some things you cannot do easily or efficiently with Spring AOP, such as advise very fine-grained objects (such as domain objects typically): AspectJ is the best choice in such cases. However, our experience is that Spring AOP provides an excellent solution to most problems in enterprise Java applications that are amenable to AOP

Spring AOP currently supports only method execution join points (advising the execution of methods on Spring beans). Field interception is not implemented, although support for field interception could be added without breaking the core Spring AOP APIs. If you need to advise field access and update join points, consider a language such as AspectJ.

Spring AOP will never strive to compete with AspectJ to provide a comprehensive AOP solution

可參考 Spring AOP vs AspectJ

AspectJ項(xiàng)目中提供了@AspecJ注解,Spring interprets the same annotations @Aspect as AspectJ 5

Spring AOP提供了定義切面的兩種方式

  • schema-based approach : XML-based format 通常不用了
  • @AspectJ annotation style:注解形式,起這個(gè)名字是因?yàn)榻梃b了AspectJ項(xiàng)目,其實(shí)用的Spring AOP的注解是@Aspect沒(méi)有J

注解案例:

@Aspect
@Component 
public class NotVeryUsefulAspect {
	@Pointcut("execution(* transfer(..))")// the pointcut expression
	private void anyOldTransfer() {}// the pointcut signature
	@Before("execution(* com.xyz.myapp.dao.*.*(..))")
    public void doAccessCheck() {
        // ...
    }
 	@AfterReturning(
        pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
        returning="retVal")
    public void doAccessCheck(Object retVal) {
        // ...
    }
	@AfterThrowing(
        pointcut="com.xyz.myapp.SystemArchitecture.dataAccessOperation()",
        throwing="ex")
    public void doRecoveryActions(DataAccessException ex) {
        // ...
    }
	@After("com.xyz.myapp.SystemArchitecture.dataAccessOperation()")
    public void doReleaseLock() {
        // ...
    }
	@Around("com.xyz.myapp.SystemArchitecture.businessService()")
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
        Object retVal = pjp.proceed();
        // stop stopwatch
        return retVal;
    }
}

AOP概念

  • Aspect:cut cross multiple classes. Spring AOP通過(guò) schema-based approach 或 @AspectJ annotation style 兩種方式定義切面。
  • Join Point:程序執(zhí)行點(diǎn),通常代表一個(gè)方法的執(zhí)行。
  • Advice:Aspect中針對(duì)不同Join Point執(zhí)行的操作,包括 around before after 三種advice。很多AOP框架將advice建模成interceptor,在Join Point外層維護(hù)一個(gè) chain of interceptors。
  • Pointcut:匹配 Join Points的規(guī)則,如@PointCut("pointcut expression"),滿足point expression的將進(jìn)行切面。
  • Target object:被切面的對(duì)象。
  • AOP proxy:代理,Spring Framework通常使用JDK 動(dòng)態(tài)代理或CGLIB動(dòng)態(tài)代理。
  • Weaving:linking aspects with other application types or objects to create an advised object. 發(fā)生在編譯、加載或運(yùn)行時(shí)。

Type of advice

  • before : @Before
  • after returning : @AfterReturning
  • after throwing : @AfterThrowing
  • after (finally) : @After
  • around : @Around

代理順序

當(dāng)一個(gè)target object有多個(gè)Spring AOP代理時(shí),代理類執(zhí)行的順序有時(shí)很重要,比如分布式鎖代理和事務(wù)代理的順序,分布式鎖必須包裹住事務(wù)。

先下結(jié)論:

Spring通過(guò)接口或注解來(lái)判斷代理的順序,順序級(jí)別越低,代理越靠?jī)?nèi)層。順序級(jí)別獲取步驟如下:

  • 是否實(shí)現(xiàn)org.springframework.core.Ordered接口
  • 是否注解了org.springframework.core.annotation.Order注解
  • 是否注解了javax.annotation.Priority注解
  • 如果都沒(méi)有,默認(rèn)最低優(yōu)先級(jí)LOWEST_PRECEDENCE = Integer.MAX_VALUE,如@Transanctional注解就是最低級(jí)別

優(yōu)先級(jí)定義范圍在Integer.MIN_VALUEInteger.MAX_VALUE(參見(jiàn)Orderd接口)。越小,優(yōu)先級(jí)越高,越在外層先執(zhí)行。

注解方式生成代理類是通過(guò)BeanPostProcessor實(shí)現(xiàn)的,由AspectJAwareAdvisorAutoProxyCreator完成,該類實(shí)現(xiàn)了BeanPostProcessor

注意到該類有一個(gè)Comparator類字段。最終優(yōu)先級(jí)由AnnotationAwareOrderComparator來(lái)判斷:

public class AnnotationAwareOrderComparator extends OrderComparator {
	/**
	 * Shared default instance of {@code AnnotationAwareOrderComparator}.
	 */
	public static final AnnotationAwareOrderComparator INSTANCE = new AnnotationAwareOrderComparator();
		@Override
	@Nullable
	protected Integer findOrder(Object obj) {
		// 父類,判斷是否實(shí)現(xiàn)了Orderd接口
		// (obj instanceof Ordered ? ((Ordered) obj).getOrder() : null)
		Integer order = super.findOrder(obj);
		if (order != null) {
			return order;
		}
		// 沒(méi)有實(shí)現(xiàn)則繼續(xù)搜尋@Order和@Priority注解
		// 如果返回null,表示找不到,會(huì)返回父類執(zhí)行g(shù)etOrder方法返回Ordered.LOWEST_PRECEDENCE
		return findOrderFromAnnotation(obj);
	}
	@Nullable
	private Integer findOrderFromAnnotation(Object obj) {
		...
		// 找@Order和@Priority注解
		Integer order = OrderUtils.getOrderFromAnnotations(element, annotations);
		// 如果該類沒(méi)有注解,遞歸找被代理類
		if (order == null && obj instanceof DecoratingProxy) {
			return findOrderFromAnnotation(((DecoratingProxy) obj).getDecoratedClass());
		}
		// 被代理類有則返回優(yōu)先級(jí),沒(méi)有則返回null
		return order;
	}
}

到此這篇關(guān)于Spring AOP與代理類的執(zhí)行順序級(jí)別淺析的文章就介紹到這了,更多相關(guān)Spring AOP與代理類內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Servlet的線程安全問(wèn)題

    Servlet的線程安全問(wèn)題

    本文主要介紹了Servlet的線程安全問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 關(guān)于JFormDesigner的安裝及破姐超詳細(xì)教程

    關(guān)于JFormDesigner的安裝及破姐超詳細(xì)教程

    JFormDesigner是一種先進(jìn)的圖形用戶界面Swing?的設(shè)計(jì)工具(非開源),具有一個(gè)獨(dú)立的開發(fā)工具產(chǎn)品和基于不同開發(fā)工具如Eclipse、NetBeans等的開發(fā)插件,本文給大家介紹JFormDesigner安裝破解教程,感興趣的朋友一起看看吧
    2023-12-12
  • SpringBoot中RabbitMQ集群的搭建詳解

    SpringBoot中RabbitMQ集群的搭建詳解

    單個(gè)的?RabbitMQ?肯定無(wú)法實(shí)現(xiàn)高可用,要想高可用,還得上集群。這篇文章主要介紹了SpringBoot中RabbitMQ集群的兩種模式的搭建:普通集群搭建和鏡像集群搭建,需要的朋友可以參考一下
    2021-12-12
  • idea啟動(dòng)多個(gè)服務(wù)不顯示Services或者RunDashboard窗口的處理方法

    idea啟動(dòng)多個(gè)服務(wù)不顯示Services或者RunDashboard窗口的處理方法

    這篇文章主要介紹了idea啟動(dòng)多個(gè)服務(wù)不顯示Services或者RunDashboard窗口,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • JavaMailSender實(shí)現(xiàn)郵箱驗(yàn)證功能

    JavaMailSender實(shí)現(xiàn)郵箱驗(yàn)證功能

    本篇文章主要給大家介紹了JavaMailSender實(shí)現(xiàn)郵箱注冊(cè)驗(yàn)證的功能實(shí)現(xiàn)原理以及其中遇到的問(wèn)題,一起跟著學(xué)習(xí)探討下吧。
    2017-12-12
  • java中并發(fā)Queue種類與各自API特點(diǎn)以及使用場(chǎng)景說(shuō)明

    java中并發(fā)Queue種類與各自API特點(diǎn)以及使用場(chǎng)景說(shuō)明

    這篇文章主要介紹了java中并發(fā)Queue種類與各自API特點(diǎn)以及使用場(chǎng)景說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 詳解關(guān)于Spring Cloud 框架熱部署的方法

    詳解關(guān)于Spring Cloud 框架熱部署的方法

    本篇文章主要介紹了詳解關(guān)于Spring Cloud 框架熱部署的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢使用

    Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢使用

    這篇文章主要介紹了Mybatis中一對(duì)多(collection)和一對(duì)一(association)的組合查詢使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 23種設(shè)計(jì)模式(12)java模版方法模式

    23種設(shè)計(jì)模式(12)java模版方法模式

    這篇文章主要為大家詳細(xì)介紹了23種設(shè)計(jì)模式之java模版方法模式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java中解壓縮文件的方法詳解(通用)

    Java中解壓縮文件的方法詳解(通用)

    在軟件開發(fā)和數(shù)據(jù)處理領(lǐng)域,文件的解壓縮和壓縮是常見(jiàn)的任務(wù),下面這篇文章主要給大家介紹了關(guān)于Java中解壓縮文件的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06

最新評(píng)論

开封市| 抚远县| 贺兰县| 遂昌县| 永泰县| 古交市| 曲沃县| 印江| 新源县| 临洮县| 弥勒县| 诸暨市| 呈贡县| 建德市| 潢川县| 长子县| 河源市| 嘉义县| 二连浩特市| 钟山县| 通化县| 寿宁县| 牡丹江市| 延津县| 安龙县| 金平| 武陟县| 宁海县| 雷州市| 潮州市| 剑河县| 陕西省| 连平县| 四平市| 新郑市| 巴林左旗| 高淳县| 榕江县| 左权县| 习水县| 高台县|