AspectJ
我们目前使用AOP的不足?
我们目前使用的schema Baes 实现的方式,发现了每一个通知都需要实现对应的接口,每一个接口中就是一个方法,这样的书写方式比较的麻烦的,我们想所有的方法都在一个类中书写就比较方便了
Aspect J方式实现:
Aspect J方式实现
我们发现 Aspect J的方式虽然可以把所有的通知都结合到一起,书写方便,但是获得切点中的参数和切点所在的类的时候比较的繁琐
两种方式的使用场景:
- schema base :如果我们需要使用切点中的参数或者切点所在的类对象的时候
- aspect J:就是简单的给切点增加通知的时候使用这个方式比较简单
具体实现:
package com.test;
import com.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test2 {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext2.xml");
User us = app.getBean("us", User.class);
us.a();
}
}
package com.advice;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
//@Component
//@Aspect
public class AspectJAdvice {
//前置通知方法
//@Before("execution(* com.pojo.User.a())")
public void beforAd(JoinPoint joinPoint) {
System.out.println("前置通知");
}
//后置通知方法
public void afterAd() {
System.out.println("后置通知");
}
//环绕通知方法
public Object aroundAd(ProceedingJoinPoint point) throws Throwable {
System.out.println("环绕通知--前");
Object o = point.proceed();
System.out.println("环绕通知--后");
return o;
}
//异常通知方法
public void throwsAd() {
System.out.println("异常通知");
}
}
<?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"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
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.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<bean id="us" class="com.pojo.User"></bean>
<!--配置通知类的对象-->
<bean id="aps" class="com.advice.AspectJAdvice"></bean>
<aop:config>
<aop:aspect ref="aps">
<aop:pointcut id="pt" expression="execution(* com.pojo.User.a())"></aop:pointcut>
<!--给切点增加对应的通知-->
<aop:before method="beforAd" pointcut-ref="pt"></aop:before>
<!--无论切点中方法是否有异常,这个后置通知都会执行-->
<aop:after method="afterAd" pointcut-ref="pt"></aop:after>
<!--只有切点中的方法没有异常的时候才会执行这个通知-->
<!--<aop:after-returning method="afterAd" pointcut-ref="pt"></aop:after-returning>-->
<aop:around method="aroundAd" pointcut-ref="pt"></aop:around>
<aop:after-throwing method="throwsAd" pointcut-ref="pt"></aop:after-throwing>
</aop:aspect>
</aop:config>
</beans>
运行结果: