好的,下面分别给出基于JDK动态代理和基于CGLIB动态代理的示例代码。
1. 基于JDK动态代理
首先需要定义一个切面类,用来实现额外的逻辑:
```java
public class LogAspect {
public void before() {
System.out.println("方法执行前");
}
public void after() {
System.out.println("方法执行后");
}
}
```
然后定义一个接口和一个实现类:
```java
public interface UserService {
void save();
}
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户信息");
}
}
```
最后,在应用程序中使用JDK动态代理来创建代理对象,并将切面逻辑织入到代理对象中:
```java
public class Main {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
// 创建切面对象
LogAspect logAspect = new LogAspect();
// 创建代理对象
UserService proxy = (UserService) Proxy.newProxyInstance(
userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 在方法执行前调用切面逻辑
logAspect.before();
// 调用目标方法
Object result = method.invoke(userService, args);
// 在方法执行后调用切面逻辑
logAspect.after();
return result;
}
});
// 使用代理对象调用方法
proxy.save();
}
}
```
在上面的代码中,我们使用了JDK提供的Proxy类来创建代理对象,并实现了InvocationHandler接口来定义代理对象的行为。在invoke方法中,我们首先调用切面对象的before方法,在目标方法执行前添加额外的逻辑;然后调用目标方法;最后调用切面对象的after方法,在目标方法执行后添加额外的逻辑。
2.