赞
踩
- Aspect(切面): 其实就是我们定义的切面类,里面可以定义切入点表达式和前后通知
- Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式
- JointPoint(连接点):程序执行过程中被切面拦截的点,这个点可以是方法也可以是类
- Advice(通知):AOP在特定的切入点上执行的增强处理:before,after,afterReturning,afterThrowing,around
- AOP代理:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类
切面 = 切点+通知
连接点和切入点的区别:
Jointpoint(连接点) 是具体的某个目标方法
Pointcut(切入点) 用于指定 “连接点” 的一个表达式
通知类型
- Before:在目标方法被调用之前做增强处理
- AfterReturning:在目标方法正常完成后做增强,@AfterReturning除了可以写切入点表达式,还可以指定一个返回值形参名returning,代表目标方法的返回值
- AfterThrowing:主要用来处理程序中未处理的异常,@AfterThrowing除了可以写切入点表达式外,还可以指定一个throwing的返回值形参名,可以通过该形参名来访问目标方法中所抛出的异常对象
- After:在目标方法完成之后做增强,无论目标方法是否成功完成。@After可以指定一个切入点表达式
- Around:环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知,注意编程中核心是一个ProceedingJoinPoint
引入jar
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
</dependency>
@EnableAspectJAutoProxy @Component @Aspect public class Operator { //切面类,对应概念里面的Aspect @Pointcut("execution(* ...service.*)") //切点,对应概念里面的Pointcut public void pointCut(){ //配置切点 } @Before("pointCut()") //切点,对应概念里面的Pointcut public void doBefore(JoinPoint joinPoint){ //通知-在目标方法被调用之前做增强处理 } @After("pointCut()") public void doAfter(JoinPoint joinPoint){ //通知-在目标方法完成之后做增强 } @AfterReturning(pointcut="pointCut()",returning="returnVal") public void afterReturn(JoinPoint joinPoint,Object returnVal){ //通知-在目标方法正常完成后做增强 } @AfterThrowing(pointcut="pointCut()",throwing="error") public void afterThrowing(JoinPoint joinPoint,Throwable error){ //通知-主要用来处理程序中未处理的异常 } @Around("pointCut()") public void around(ProceedingJoinPoint pjp){ //通知-环绕通知,在目标方法完成前后做增强处理,环绕通知是最重要的通知类型,像事务,日志等都是环绕通知 System.out.println("AOP Aronud before..."); pjp.proceed();//执行目标方法 System.out.println("AOP Aronud after..."); } }
spring aop常用的就是下面几个注解
- @Aspect 标注增强处理类(切面)
- @Pointcut 自定义切点位置
- @Around 定义增强,环绕通知处理
下面使用编码式如何去实现一个切面
public class TestMethod {
public void test(){
System.out.println("测试方法");
}
}
@Component
public class TestMethodInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("方法调用前");
Object proceed = methodInvocation.proceed();
System.out.println("方法调用后");
return proceed;
}
}
public static void main(String[] args) { TestMethod delegate = new TestMethod();//目标 TestMethodInterceptor interceptor = new TestMethodInterceptor();//准备通知 JdkRegexpMethodPointcut pointcut = new JdkRegexpMethodPointcut (); pointcut.setPattern("com.example.demo.TestMethod.*");//定义切点 //切面=切点+通知 Advisor advisor = new DefaultPointcutAdvisor(pointcut, interceptor); //创建一个代理工厂 ProxyFactory factory = new ProxyFactory(); factory.addAdvisor(advisor);//给代理工厂一个切面 factory.setTarget(delegate);//需要被代理的对象 TestMethod proxy = (TestMethod) factory.getProxy(); proxy.test(); }
方法调用前
测试方法
方法调用后
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。