Spring Aop实现
spring通过切点的方式可以实现对目标方法实现aop增强,下面是实现aop的四大步骤。
1.准备好切点
AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression("execution(* foo())");2.准备通知
MethodInterceptor advice = invocation -> {System.out.println("before...");Object proceed = invocation.proceed();System.out.println("after...");return proceed;};3.准备切面
DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut,advice);4.创建代理
Target target = new Target();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAdvisor(advisor);I1 proxy = (I1) proxyFactory.getProxy();System.out.println(proxy.getClass());proxy.foo();System.out.println("___________");proxy.bar();5.总体实现
package com.example.springdemo.demos.a29;import org.aopalliance.intercept.MethodInterceptor;
import org.springframework.aop.aspectj.AspectJExpressionPointcut;
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;/*** @author zhou* @version 1.0* @description TODO* @date 2025/11/6 22:21*/
public class A29 {public static void main(String[] args) {//1.准备好切点AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();pointcut.setExpression("execution(* foo())");//2.准备通知MethodInterceptor advice = invocation -> {System.out.println("before...");Object proceed = invocation.proceed();System.out.println("after...");return proceed;};//3.准备切面DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut,advice);//4.创建代理Target target = new Target();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.addAdvisor(advisor);I1 proxy = (I1) proxyFactory.getProxy();System.out.println(proxy.getClass());proxy.foo();System.out.println("___________");proxy.bar();}interface I1{void foo();void bar();}static class Target implements I1{@Overridepublic void foo() {System.out.println("Target foo");}@Overridepublic void bar() {System.out.println("Target Bar");}}
}
结果:

从输出结果可以看到,foo方法匹配了切点表达式并且进行了增强,从打印的代理类对象可以看出,通过代理工厂创建的代理是cglib代理。
