1.JDK动态代理
主要使用到 InvocationHandler 接口和 Proxy.newProxyInstance() 方法。 JDK动态代理要求被代理实现一个接口,只有接口中的方法才能够被代理 。其方法是将被代理对象注入到一个中间对象,而中间对象实现InvocationHandler接口,在实现该接口时,可以在 被代理对象调用它的方法时,在调用的前后插入一些代码。而 Proxy.newProxyInstance() 能够利用中间对象来生产代理对象。插入的代码就是切面代码。所以使用JDK动态代理可以实现AOP。
下面来看例子
interface
public interface UserService {
void addUser();
String findUserById();
}
impl
import com.spring.aop.jdk.service.UserService;
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("start insert user into database");
}
@Override
public String findUserById() {
System.out.println("start find user by userId");
return null;
}
}
代理中间类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyUtil implements InvocationHandler {
private Object target;//被代理的对象
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("do something before");
// 调用被代理对象的方法并得到返回值
Object result = method.invoke(target, args);
System.out.println("do something after");
return result;
}
public ProxyUtil(Object target) {
this.target = target;
}
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
}
Test
import java.lang.reflect.Proxy;
import com.spring.aop.jdk.proxy.ProxyUtil;
import com.spring.aop.jdk.service.UserService;
import com.spring.aop.jdk.service.impl.UserServiceImpl;
public class Main {
public static void main(String[] args) {
Object proxyObject = new UserServiceImpl();
ProxyUtil proxyUtil = new ProxyUtil(proxyObject);
UserService userService = (UserService) Proxy.newProxyInstance(
Thread.currentThread().getContextClassLoader(),
UserServiceImpl.class.getInterfaces(), proxyUtil);
userService.addUser();
userService.findUserById();
}
}
输出结果
do something before
start insert user into database
do something after
do something before
start find user by userId
do something after
网友评论