1. jdk 动态代理
特点:代理类有接口实现
1.代理类接口 UserService
public interface UserService {
public void addUser();
public void delUser();
public void updateUser();
}
- 代理类
public class UserServiceImpl implements UserService {
@Override
public void addUser() {
System.out.println("addUser");
}
@Override
public void delUser() {
System.out.println("delUser");
}
@Override
public void updateUser() {
System.out.println("updateUser");
}
}
- 切面类(在代理类中执行的操作在切面类中定义)
public class MyAspect {
public void before() {
System.out.println("befoer");
}
public void after() {
System.out.println("after");
}
}
- 代理工厂(生成 UserService 实例 的工厂)
public class UsreServiceFactory {
public static UserService createUserService() {
final UserService service = new UserServiceImpl(); // 因为下面是在匿名内部类中引用,需要定义成 final 类型
final MyAspect aspect = new MyAspect();
return (UserService) Proxy.newProxyInstance(service.getClass().getClassLoader(), service.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object retvalue = null;
if(method.getName().equals("addUser")) { // 只对特定的方法进行拦截
aspect.before();
retvalue = method.invoke(service, args);
aspect.after();
}
return retvalue;
}
});
}
}
- 测试类
public class Test1 {
@Test
public void test01() {
// 由代理工厂生产出实例
UserService service = UsreServiceFactory.createUserService();
service.addUser();
service.delUser();
}
}
- 测试结果
befoer
addUser
after
* 因为在上面的代理工厂中只拦截了 addUser()方法,delUser() 没有通知 *
2. spring cjlib 代理
public class UserServiceCjlibFactory {
public static UserServiceImpl createUserService() {
final MyAspect aspect = new MyAspect();
final UserServiceImpl service = new UserServiceImpl();
Enhancer enhancer = new Enhancer();
// 确认父类
enhancer.setSuperclass(service.getClass());
// 设置回调函数
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
aspect.before();
// 执行目标方法类
Object rtvalue = method.invoke(service, args);
// 执行代理类的父类 , 执行目标类 (目标类和代理类的父子关系)
// methodProxy.invokeSuper(proxy, args);
aspect.after();
return rtvalue;
}
});
// 创建代理
return (UserServiceImpl) enhancer.create();
}
}
结果
befoer
addUser
after