下面是关于“springAOP的三种实现方式示例代码”的完整攻略。
Spring AOP的三种实现方式示例代码
Spring AOP提供了三种实现AOP的方式,分别是基于JDK的动态代理、CGLIB代理和使用AspectJ实现。接下来我将分别介绍这三种方式,并提供代码示例,帮助读者更好地理解。
基于JDK的动态代理
- 接口
JDK动态代理只能代理实现了接口的类,所以我们首先需要定义一个接口:
public interface Person {
void sayHello();
}
- 实现类
创建Person的实现类:
public class Student implements Person {
@Override
public void sayHello() {
System.out.println("Hello, I am a student.");
}
}
- 代理类
创建代理类,在代理类中创建InvocationHandler对象。
public class JDKDynamicProxy implements InvocationHandler {
private Object target; //目标对象
public JDKDynamicProxy(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Before method invoke.");
Object result = method.invoke(target, args); //调用目标对象的方法
System.out.println("After method invoke.");
return result;
}
}
- 测试
在测试类中使用Proxy工具类创建代理类对象并调用方法:
public class Test {
public static void main(String[] args) {
Person person = new Student();
Person proxyInstance = (Person) Proxy.newProxyInstance(
person.getClass().getClassLoader(),
person.getClass().getInterfaces(),
new JDKDynamicProxy(person)
);
proxyInstance.sayHello();
}
}
输出结果:
Before method invoke.
Hello, I am a student.
After method invoke.
基于CGLIB代理
- 实现类
首先创建一个没有实现接口的类:
public class Student {
public void sayHello() {
System.out.println("Hello, I am a student.");
}
}
- 代理类
创建代理类,在代理类中创建MethodInterceptor对象。
public class CglibProxy implements MethodInterceptor {
@Override
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
System.out.println("Before method invoke.");
Object result = proxy.invokeSuper(obj, args); //调用目标对象的方法
System.out.println("After method invoke.");
return result;
}
}
- 测试
在测试类中使用Enhancer工具类创建代理类对象并调用方法:
public class Test {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(Student.class);
enhancer.setCallback(new CglibProxy());
Student studentProxy = (Student) enhancer.create();
studentProxy.sayHello();
}
}
输出结果:
Before method invoke.
Hello, I am a student.
After method invoke.
使用AspectJ实现
- 切面类
创建切面类,使用@Aspect注解标记。
@Aspect
@Component
public class LogAspect {
@Before("execution(public void com.example.aop.demo.Student.sayHello())")
public void beforeAdvice() {
System.out.println("Before method invoke.");
}
@After("execution(public void com.example.aop.demo.Student.sayHello())")
public void afterAdvice() {
System.out.println("After method invoke.");
}
}
- 测试
在测试类中创建ApplicationContext容器,从容器中获取Student对象并调用其方法:
public class Test {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(Config.class);
Student student = (Student) context.getBean("student");
student.sayHello();
}
}
输出结果:
Before method invoke.
Hello, I am a student.
After method invoke.
以上就是三种实现方式的攻略,希望能对大家有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springAOP的三种实现方式示例代码 - Python技术站