spring學習 十 schema-based 前置後後置通知
阿新 • • 發佈:2018-10-04
point utf-8 後置 實現接口 測試 運行 jar 需要 圖片
spring 提供了 2 種 AOP 實現方式:(1)Schema-based ,(2)AspectJ
Schema-based:每個通知都需要實現接口或類,配置 spring 配置文件時在<aop:config>配置
AspectJ:每個通知不需要實現接口或類,配置 spring 配置文件是在<aop:config>的子標簽<aop:aspect>中配置
基於Schema-based實現的入門程序
(1)第一步:導入jar包,除了spring中必須的包,下面兩個包
(2)第二步:新建通知類
如果要實現前置通知,後置通知,在Schema-based方式中需要實現 MethodBeforeAdvice與 AfterReturningAdvice兩個接口,代碼如下;
前置通知代碼,before方法的參數:
arg0: 切點方法對象 Method 對象
arg1: 切點方法參數
arg2:切點在哪個對象中
import java.lang.reflect.Method; import org.springframework.aop.BeforeAdvice; import org.springframework.aop.MethodBeforeAdvice; public class MyBeforeAdvice implements MethodBeforeAdvice{ @Override public void before(Method arg0, Object[] arg1, Object arg2) throwsThrowable { System.out.println("前置通知"); } }
後置通知代碼:
afterReturning方法的參數:
arg0: 切點方法返回值
arg1:切點方法對象
arg2:切點方法參數
arg3:切點方法所在類的對象
package com.airplan.pojo; import java.lang.reflect.Method; import org.springframework.aop.AfterReturningAdvice; public class MyAfterAdvice implementsAfterReturningAdvice{ @Override public void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws Throwable { System.out.println("後置通知"); } }
第三步:aop配置
3.1 引入 aop 命名空間
3.2 配置通知類的<bean>
3.3 配置切面
3.4 * 通配符,匹配任意方法名,任意類名,任意一級包名
3.5 如果希望匹配任意方法參數 (..)
代表把返回值為任意類型,
且在PointCutClass類下面的,參數為任意的方法聲明為切點
expression="* execution(void com.airplan.pojo.PointCutClass.*(..))"
下面的配置代表把通知和切入點進行對應
<aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypoint"/>
<aop:advisor advice-ref="afterAdvice" pointcut-ref="mypoint"/>
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd "> <!-- 配置通知所在的類 --> <bean id="beforeAdvice" class="com.airplan.pojo.MyBeforeAdvice"></bean> <bean id="afterAdvice" class="com.airplan.pojo.MyAfterAdvice"></bean> <!-- 配置切面 --> <aop:config> <!-- 配置切點 --> <aop:pointcut expression="execution(void com.airplan.pojo.PointCutClass.testFun())" id="mypoint"/> <!-- 配置通知 --> <aop:advisor advice-ref="beforeAdvice" pointcut-ref="mypoint"/> <aop:advisor advice-ref="afterAdvice" pointcut-ref="mypoint"/> </aop:config> <!-- 配置切點所在的類 --> <bean id="pointCutClass" class="com.airplan.pojo.PointCutClass"></bean> </beans>
第四步:測試代碼
package com.airplan.test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.airplan.pojo.PointCutClass; public class AopDemo { public static void main(String[] args) { ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml"); PointCutClass pointCutClass = ac.getBean("pointCutClass",PointCutClass.class); pointCutClass.testFun(); } }
運行結果;
spring學習 十 schema-based 前置後後置通知