动态代理的代码示例
- 真实对象
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户!");
}
@Override
public void delete() {
System.out.println("删除用户!");
}
@Override
public void update() {
System.out.println("更新用户!");
}
@Override
public void find() {
System.out.println("查找用户!");
}
}
- 代理工厂
public class UserServiceProxyFactory implements InvocationHandler {
/**
* 让调用者创建代理工厂的时候必须传入一个代理的真实对象,一个实例
*/
public UserServiceProxyFactory(UserService us) {
super();
this.us = us;
}
private UserService us;
/**
* 获得代理对象
*/
public UserService getUserServiceProxy(){
//生成动态代理, this是指实InvocationHandler现接口的类
UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(), this);
//返回
return usProxy;
}
/**
* 对代理对象的方法进行增强
*/
@Override
public Object invoke(Object arg0, Method method, Object[] arg2) throws Throwable {
System.out.println("打开事务!");
//传入一个方法所在的对象(一个实例)和参数值
Object invoke = method.invoke(us, arg2);
System.out.println("提交事务!");
return invoke;
}
}
- 测试代码
@Test
//动态代理
public void fun1(){
UserService us = new UserServiceImpl();
//传入一个真实对象获得一个代理工厂
UserServiceProxyFactory factory = new UserServiceProxyFactory(us);
//获得代理对象
UserService usProxy = factory.getUserServiceProxy();
//调用代理对象的方法
usProxy.save();
//代理对象与被代理对象实现了相同的接口
//代理对象 与 被代理对象没有继承关系
System.out.println(usProxy instanceof UserServiceImpl );//false
}
- 结果
打开事物!
保存用户!
提交事务!
手动使用cglib代理代码示例
因为Spring结合了cglib,所以不需要导包直接使用包中方法
代理对象
public class UserServiceProxyFactory2 implements MethodInterceptor {
/**
* 获得代理对象
*/
public UserService getUserServiceProxy(){
//spring包中的cglib类,是获取代理对象
Enhancer en = new Enhancer();
//设置对谁进行代理
en.setSuperclass(UserServiceImpl.class);
//代理要做什么, 参数是传入实现MethodInterceptor接口的类
en.setCallback(this);
//创建代理对象
UserService us = (UserService) en.create();
return us;
}
@Override
public Object intercept(Object prxoyobj, Method method, Object[] arg, MethodProxy methodProxy) throws Throwable {
//打开事务
System.out.println("打开事务!");
//调用原有方法
Object returnValue = methodProxy.invokeSuper(prxoyobj, arg);
//提交事务
System.out.println("提交事务!");
return returnValue;
}
}