##一、首先在Spring的xml配置文件中引入AOP的命名空间 ##二、进行面向切面的两种方式: ###(一)基于xml配置方式进行AOP开发
-
1、首先定义一个普通的切面类MyInterceptor
public class MyInteceptor{ public void doAccessCheck(){ System.out.println("前置通知") } public void doAfterReturning(){ System.out.println("后置通知") } public void doAfter(){ System.out.println("最终通知") } public void doAfterThrowing(){ System.out.println("例外通知") } public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕通知") Object result = pjp.proceed(); return result; } }
-
2、在Spring的xml配置文件中进行如下配置
<beans……> <aop:aspectj-autoproxy/> <!--将MyInterceptor类纳入Spring容器进行管理--> <bean id="myInterceptor" class="com.abinge.aop.MyInterceptor"> <!--将MyInterceptor类配置为切面--> <aop:config> <aop:aspect id="myAsp" ref="myInterceptor"> <aop:pointcut id="mycut" expression="execution(* com.abinge.aop.PersonServiceBean.*(..))"/> <aop:before pointcut-ref="mycut" method="doAccessCheck"> <aop:after-returning pointcut-ref="mycut" method="doAfterReturning"> <aop:after-throwing pointcut-ref="mycut" method="doAfterThrowing"> <aop:after pointcut-ref="mycut" method="doAfter"> <aop:around pointcut-ref="mycut" method="doBasicProfiling"> </aop:aspect> </aop:config> </beans>
###(二)基于注解方式进行AOP开发
-
1、首先在Spring的xml配置文件中的根标签beans中添加如下子标签:
<beans……> <aop:aspectj-autoproxy/> </beans>
-
2、定义一个切面类MyInterceptor
@Aspect //@Aspect表示这是一个切面类 public class MyInteceptor{ //声明一个切入点,拦截com.abinge.aop.PersonServiceBean类中的所有方法 @Pointcut("execution(* com.abinge.aop.PersonServiceBean.*(..))") private void anyMethod(){}//声明一个切入点 @Before("anyMethod()") //添加前置通知,需要将切入点的名称填入 public void doAccessCheck(){ System.out.println("前置通知") } @AfterReturning("anyMethod()") //添加后置通知,需要将切入点的名称填入 public void doAfterReturning(){ System.out.println("后置通知") } @After("anyMethod()") //添加最终通知,需要将切入点的名称填入 public void doAfter(){ System.out.println("最终通知") } @AfterThrowing("anyMethod()") //添加例外通知,需要将切入点的名称填入 public void doAfterThrowing(){ System.out.println("例外通知") } @Around("anyMethod()") //添加环绕通知,需要将切入点的名称填入 //注意1:环绕通知的方式格式是固定的,除了方法名和参数名可以自定义外,其他为固定格式 //注意2:在环绕通知方法中必须执行Object result = pjp.proceed(); public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable { System.out.println("环绕通知") Object result = pjp.proceed(); return result; } }
-
3、将上述切面类MyInterceptor纳入Spring容器中进行管理,在Spring的xml配置文件中添加bean标签:
<beans……> <aop:aspectj-autoproxy/> <bean id="myInterceptor" class="com.abinge.aop.MyInterceptor"/> <bean id="personServiceBean" class="com.abinge.aop.PersonServiceBean"/> </beans>
注解时的细节处理: 1. 当需要获取拦截方法传入的参数时,可以如下表示:
@Before("anyMethod() && args(name)")
public void doAccessCheck(String name){
System.out.println("前置通知")
}
//这样就可以获取被拦截方法传入的字符串参数的值了
//但是只会拦截com.abinge.aop.PersonServiceBean类中参数为一个字符串类型方法,其他的方法不会拦截
2. 当需要获取被拦截方法执行后的返回值时,可以如下表示:
@AfterReturning(pointcut="anyMethod()",returnint="result") //添加后置通知,需要将切入点的名称填入
public void doAfterReturning(String result){
System.out.println("后置通知")
}
//这样就可以通过参数result获取被拦截对象执行后的返回值
//但是只会拦截com.abinge.aop.PersonServiceBean类中返回值为字符串类型的方法,其他的方法不会拦截
3. 当需要获取被拦截方法执行后的返回值时,可以如下表示:
@AfterThrowing(pointcut="anyMethod()",throwing="e") //添加例外通知,需要将切入点的名称填入
public void doAfterThrowing(Exception e){
System.out.println("例外通知")
}
//这样就可以通过参数e获取被拦截对象执行中的异常