基于AsceptJ注解的AOP编程
1. 开发步骤
- 提供原始类对象
- 实现额外功能
- 配置切入点
- 组装切面
上面这几步是面向AOP编程的大致步骤,而基于注解的AOP编程会简化AOP开发的过程。
基于注解的AOP开发步骤:
- 自定义类用于实现额外功能和组装切面
- 在类上标记
@Ascept
注解 - 自定义需要实现额外功能的方法,方法的参数要写
ProceedingJoinPoint
类型(通过使用此类型可以执行原始方法),方法的返回值设置为Object类型,用于返回原始方法的返回值。 - 在自定义的方法上标记
@Around
注解并配置注解的值(切入点表达式) - 进行测试
代码:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
@Aspect
public class MyAspect {
@Around("execution(* login(..))")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("---aspect log---");
Object ret = joinPoint.proceed();
return ret;
}
}
配置文件:
<!--提供原始类对象-->
<bean id="userService" class="com.jc.aspect.UserServiceImpl"/>
<!--注入自定义类-->
<bean id="arround" class="com.jc.aspect.MyAspect"/>
<!--告知Spring基于注解进⾏AOP编程-->
<aop:aspectj-autoproxy/>
2. 切入点的复用
如果有多个方法需要额外功能,就需要写多@Around
注解,但是execution表达式函数内的表达式会出现冗余的现象,所以引入切入点复用技术。
使用方式:
在切面类中定义⼀个方法上面标记@Pointcut
注解通过这种方式,定义切入点表达式,后续更加有利于切入点复用。
代码:
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class MyAspect {
@Pointcut("execution(* login(..))")
public void myPointcut() {}
@Around(value="myPointcut()")
public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("---aspect log---");
Object ret = joinPoint.proceed();
return ret;
}
@Around(value="myPointcut()")
public Object around1(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("---aspect tx---");
Object ret = joinPoint.proceed();
return ret;
}
}
3. 切换动态代理的创建方式
AOP底层是动态代理,动态代理的实现方式有两种,JDK动态代理和CGlib动态代理。
通过更改配置的方式可以切换动态代理的实现方式。
-
基于注解AOP开发:
<aop:aspectj-autoproxy proxy-target-class="true" />
-
原始的AOP开发:
<aop:config proxy-target-class="true"> </aop>