JDK的动态代理的小案例
jdk动态代理的介绍:需要有接口和实现类
- 目标类的接口
package com.fxy.spring.jdkproxy;
public interface UserService {
public void addUser();
public void updateUser();
public void deleteUser();
}
- 目标类的代码(target)
package com.fxy.spring.jdkproxy;
public class UserServiceImp implements UserService {
@Override
public void addUser() {
System.out.println("JDK_proxy addUser");
}
@Override
public void updateUser() {
System.out.println("JDK_proxy updateUser");
}
@Override
public void deleteUser() {
System.out.println("JDK_proxy deleteUser");
}
}
- 切面代码(advice)
package com.fxy.spring.jdkproxy;
public class MyAspect {
public void Before() {
System.out.println("执行前方法");
}
public void After() {
System.out.println("执行后方法");
System.out.println("***************");
}
}
5.工厂类代码:
package com.fxy.spring.jdkproxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class MybeanFactory {
public static UserService createUserService() {
MyAspect myAspect = new MyAspect();
UserService userService = new UserServiceImp();
UserService proxyService = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(),
userService.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
myAspect.Before();
Object obj = method.invoke(userService, args);
myAspect.After();
return obj;
}
});
return proxyService;
}
}
- 测试代码:
ackage com.fxy.spring.jdkproxy;
import org.junit.Test;
public class TestJDK {
@Test
public void test() {
UserService userService = MybeanFactory.createUserService();
userService.addUser();
userService.updateUser();
userService.deleteUser();
}
}
目的:
在切入点(要增强代码的方法)前后加入advice新的方法
过程
- 目标类中有三个方法,addUser(),updateUser(),deleteUser().
- 切面类中有两个方法,分别是After()和Before()方法。
- 工厂类生成代理目标类的对象。
- 首先在工厂类中生成目标类的对象和切面类的对象。
- 生成代理对象。
UserService proxyService = (UserService)Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { myAspect.Before(); Object obj = method.invoke(userService, args); myAspect.After(); return obj; } });
newProxyInstance中的三个参数:第一个生成类加载器,第二个获得目标类的所有接口,第三个执行代理对象的方法:在这里将目标类方法和切面类方法结合到一起。