动态代理
1.接口 :定义方法名
2.实现类(即被代理对象) implements 接口 :定义方法体
3.动态代理工厂类 implements InvocationHandler
目的:生产代理对象,加强被代理对象方法
具体:
① 定义成员变量(实现类对象)
② 有参构造(将实现类对象作为参数传入)
③ 提供方法获得代理对象(代理对象类型为接口)
(接口)Proxy.newProxyInstance(动态代理工厂类.class.getClassLoader,
实现类.class.getInterfaces, this);
注:this代表当前对象,即动态代理工厂类对象(它实现了InvocationHandler)可以让代理对象执行工厂类的invoke
④ 重写invoke方法 加强方法+method.invoke(实现类对象,args)
4.使用
① 创建实现类对象
② 创建动态代理工厂对象,有参构造传入实现类对象
③ 通过动态代理工厂获得代理对象
④ 动态代理对象执行方法
例子
//1.接口UserService
public interface UserService {
void save()
}
//2.实现类UserServiceImpl
public class UserServiceImpl implements UserService {
@Override
public void save() {
System.out.println("保存用户");
}
}
//3.动态代理工厂类
public class UserServiceProxyFactory implements InvocationHandler {
//① 定义成员变量(实现类对象)
private UserServiceImpl us;
// ② 有参构造(将实现类对象作为参数传入)
public UserServiceProxyFactory(UserServiceImpl us) {
this.us = us;
}
//③提供方法获得代理对象(代理对象类型为接口)
public UserService getUserServiceProxy(){
//生成动态代理
//Proxy.newProxyInstance(动态代理工厂类.class.getClassLoader,
实现类.class.getInterfaces, this);
UserService usProxy = (UserService) Proxy.newProxyInstance(UserServiceProxyFactory.class.getClassLoader(),
UserServiceImpl.class.getInterfaces(), this);
return usProxy;
}
//④ 重写invoke方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("打开事务");
Object invoke = method.invoke(us, args); //method.invoke(实现类对象,args)
System.out.println("提交事务");
return invoke;
}
}
//4.使用
@Test
public void fun1(){
// ① 创建实现类对象
UserServiceImpl us = new UserServiceImpl();
// ② 创建动态代理工厂对象,有参构造传入实现类对象
UserServiceProxyFactory factory = new UserServiceProxyFactory(us);
// ③ 通过动态代理工厂获得代理对象
UserService proxy = factory.getUserServiceProxy();
// ④ 动态代理对象执行方法
proxy.save();
}