需求:UserService业务类有save和update方法,希望在save,update方法执行之前记录日志。
使用JDK动态代理来实现如下:
1.编写业务类接口和其实现类
- UserService接口
public interface UserService {
public void save();
public void update();
}
- UserServiceImpl实现类
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("执行save方法");
}
@Override
public void update() {
System.out.println("执行update方法");
}
}
2.编写JDK动态代理工具类
public class JDKProxyUtils {
/**
* 使用JDK动态代理获取代理对象
* target: 目标对象
* @return
*/
public static Object getProxy(final Object target){
return Proxy.newProxyInstance(
target.getClass().getClassLoader(), // 和目标对象一样的类加载器
target.getClass().getInterfaces(), // 目标对象的接口列表
new InvocationHandler() {
//invoke: 这个方法在每次调用代理类对象的时候被执行啦!!!
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("记录日志");
//调用目标对象的方法
return method.invoke(target, args);
}
});
}
}
3.编写测试类
public class Demo1 {
@Test
public void test1(){
//目标对象
UserService service = new UserServiceImpl();
//获取JDK动态代理对象(接口代理)
UserService proxy = (UserService)JDKProxyUtils.getProxy(service);
//调用代理对象
proxy.save();
proxy.update();
}
}