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

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

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

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

Spring AOP說:

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:注解形式,起這個名字是因?yàn)榻梃b了AspectJ項(xiàng)目,其實(shí)用的Spring AOP的注解是@Aspect沒有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通過 schema-based approach 或 @AspectJ annotation style 兩種方式定義切面。
  • Join Point:程序執(zhí)行點(diǎn),通常代表一個方法的執(zhí)行。
  • Advice:Aspect中針對不同Join Point執(zhí)行的操作,包括 around before after 三種advice。很多AOP框架將advice建模成interceptor,在Join Point外層維護(hù)一個 chain of interceptors。
  • Pointcut:匹配 Join Points的規(guī)則,如@PointCut("pointcut expression"),滿足point expression的將進(jìn)行切面。
  • Target object:被切面的對象。
  • AOP proxy:代理,Spring Framework通常使用JDK 動態(tài)代理或CGLIB動態(tài)代理。
  • Weaving:linking aspects with other application types or objects to create an advised object. 發(fā)生在編譯、加載或運(yùn)行時。

Type of advice

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

代理順序

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

先下結(jié)論:

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

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

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

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

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

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;
		}
		// 沒有實(shí)現(xiàn)則繼續(xù)搜尋@Order和@Priority注解
		// 如果返回null,表示找不到,會返回父類執(zhí)行g(shù)etOrder方法返回Ordered.LOWEST_PRECEDENCE
		return findOrderFromAnnotation(obj);
	}
	@Nullable
	private Integer findOrderFromAnnotation(Object obj) {
		...
		// 找@Order和@Priority注解
		Integer order = OrderUtils.getOrderFromAnnotations(element, annotations);
		// 如果該類沒有注解,遞歸找被代理類
		if (order == null && obj instanceof DecoratingProxy) {
			return findOrderFromAnnotation(((DecoratingProxy) obj).getDecoratedClass());
		}
		// 被代理類有則返回優(yōu)先級,沒有則返回null
		return order;
	}
}

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

相關(guān)文章

  • Servlet的線程安全問題

    Servlet的線程安全問題

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

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

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

    SpringBoot中RabbitMQ集群的搭建詳解

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新評論

长海县| 阿克苏市| 丁青县| 清水河县| 乌恰县| 彭阳县| 南溪县| 利辛县| 垣曲县| 邵阳市| 江阴市| 昌黎县| 普安县| 阿尔山市| 乐山市| 桃园县| 睢宁县| 陇川县| 彩票| 桐庐县| 新乐市| 阿尔山市| 大新县| 林口县| 雅江县| 铜陵市| 鲁山县| 深州市| 高邑县| 久治县| 湘乡市| 齐河县| 平阴县| 呼伦贝尔市| 宣汉县| 鹿邑县| 星子县| 灯塔市| 高密市| 邢台市| 阿拉善左旗|