public class UserServiceFactory1 {
//被代理对象
private static UserServiceImpl us = new UserServiceImpl();
//获得UserService代理对象
public static UserService getUserServiceProxy(){
//动态代理
//参数1: 类加载器,加载代理类 => 应用类加载器
//参数2: 指定代理类实现哪个接口
//参数3: 告诉虚拟机,我们在代理类中想要做什么
return (UserService) Proxy.newProxyInstance(UserServiceFactory1.class.getClassLoader(),
new Class[]{UserService.class},
new InvocationHandler() {
@Override
//参数1: 代理对象(没啥用)
//参数2: 当前增强的业务方法
//参数3: 当前业务方法参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//如果是find方法,不增强
if(method.getName().equals("find")){
return method.invoke(us, args);
}
//增强的代码
System.out.println("开启事务");
//调用原有业务代码
Object invoke = method.invoke(us, args);
//增强的代码
System.out.println("关闭事务");
//代理方法的返回值与原有业务方法返回值一致
return invoke;
}
});
}
}
public class UserServiceFactory2 {
//获得UserService代理对象
public static UserServiceImpl getUserServiceProxy(){
//cglid代理核心对象
Enhancer en = new Enhancer();
//指定被代理类(去继承)
en.setSuperclass(UserServiceImpl.class);
//指定代理类中方法的代码
en.setCallback(new MethodInterceptor(){@Override
//参数1:代理对象
//参数2:当前业务方法
//参数3:业务方法参数
//参数4:代理方法
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("开启事务~~~~");
//通过代理方法调用父类方法 => super.业务方法()
Object object = methodProxy.invokeSuper(proxy, args);
System.out.println("关闭事务~~~~");
return object;
}});
return (UserServiceImpl) en.create();
}
}