动态代理模式
动态代理模式
1.MyBatis动态代理实现无接口实现类操作数据库实现原理
首先创建一个UserService接口
public interface UserService {
void saveUser();
void findUser();
}
在创建回调处理器,这个回调处理器就是由创建出来的代理对象来进行调用
public class ProxyInvocationHandler implements InvocationHandler { //目标对象 private Object target; public ProxyInvocationHandler(Object target){ this.target = target; } /** * @param proxy 代理对象,这个参数是代理对象在调用invoke方法时将自身this传如回来 * @param method 当前正在调用的目标对象的方法 * @param args 当前正在调用的目标对象的方法参数 * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object returnVal = null; //调用之前 System.out.println("before..."); //调用目标对象的方法 returnVal = method.invoke(target, args); System.out.println("after..."); return returnVal; }
写一个Main测试方法
public class Main {
public static void main(String[] args) {
//初始化回调处理器
InvocationHandler handler = new ProxyInvocationHandler(new UserServiceImpl());
//动态创建一个代理对象
//第一个参数是一个类加载器,由于在运行时动态创建了一个字节码,那么就需要类加载器来进行装载
//第二个参数是目标对象所实现的所有接口
//第三个参数是回调处理器实例
//注意:创建出来的代理对象已经实现了UserService接口,因此可以进行类型转换
UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), handler);
proxy.findUser();
proxy.saveUser();
}
}