Spring AOP 在 XML檔案中實現 AspectJ 攔截

AngeliaZheng發表於2018-09-18

此篇文章將展示如何將上一篇文章中 Spring AOP 的 AspectJ 註解轉成基於XML的配置。對於那些不喜歡註釋的開發者,使用JDK1.4,則可以基於XML,而不使用 AspectJ。

和 @Before 功能等價的 AspectJ <aop:before>

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- @Before -->
		<aop:pointcut id="pointCutBefore"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		<aop:before method="before" pointcut-ref="pointCutBefore" />
	</aop:aspect>
</aop:config>

  和 @After 功能等價的 AspectJ <aop:after>

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- 所有 Advice 共用的切入點 -->
		<aop:pointcut id="pointCut"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		
		<!-- @After -->
		<aop:after method="after" pointcut-ref="pointCut" />

	</aop:aspect>
</aop:config>

和 @AfterReturning 功能等價的 <aop:after-returning>

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- 所有 Advice 共用的切入點 -->
		<aop:pointcut id="pointCut"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		
		<aop:after-returning method="afterReturning" returning="result" pointcut-ref="pointCut" />
		
	</aop:aspect>
</aop:config>

和 @AfterThrowing 功能等價的 <aop:after-throwing>

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- 所有 Advice 共用的切入點 -->
		<aop:pointcut id="pointCut"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		
		<aop:after-throwing method="afterThrowing" throwing="error" pointcut-ref="pointCut" />
		
	</aop:aspect>
</aop:config>

和 @Around 功能等價的 <aop:after-around>

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- 所有 Advice 共用的切入點 -->
		<aop:pointcut id="pointCut"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		
		<aop:around method="around" pointcut-ref="pointCut" />
	</aop:aspect>
</aop:config>

所有通知的配置

<aop:config>
	<aop:aspect id="aspectJD" ref="aspectJDemo">
		<!-- 所有 Advice 共用的切入點 -->
		<aop:pointcut id="pointCut"
			expression="execution(* com.angelia.spring.service.ArticleServiceImpl.queryArticleById(..))" />
		<!-- @Before -->
		<aop:before method="before" pointcut-ref="pointCut" />
		<!-- @After -->
		<aop:after method="after" pointcut-ref="pointCut" />
		<aop:after-returning method="afterReturning" returning="result" pointcut-ref="pointCut" />
		<aop:after-throwing method="afterThrowing" throwing="error" pointcut-ref="pointCut" />
		<aop:around method="around" pointcut-ref="pointCut" />
	</aop:aspect>
</aop:config>

專案程式碼連結: https://pan.baidu.com/s/1gA5Rm4yvcpPJmDGUQX70lQ 密碼: 259a 

相關文章