在这里插入代码片
1.JDK动态代理
public class MyHandler implements InvocationHandler {
//声明代理对象即是需要增强处理的对象
private Object target;
public MyHandler(Object target) {
this.target = target;
}
public MyHandler() {
}
//定义方法获取动态生成的代理对象
public Object getProxyInstance(){
//通过Proxy类的newInstance方法 动态生成代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
//业务增强的方法
/**
*
* @param proxy 动态生成的代理对象实例
* @param method 被代理对象当前正在执行的业务方法
* @param args 被代理对象的正在执行的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("================获取数据库连接==================");
//通知被代理对象进行相关业务
method.invoke(target,args);
System.out.println("===============关闭连接========================");
return null;
}
}
2.spring的cglig代理
public static void main(String[] args) {
//创建被代理对象
UserDao userDao = new UserDaoImpl();
//创建cglib核心对象
Enhancer enhancer = new Enhancer();
//设置父类
enhancer.setSuperclass(userDao.getClass());
//设置回调
enhancer.setCallback(new MethodInterceptor() {
/**
* 当你调用目标方法实际上是调用该方法
* @param proxy 代理对象
* @param method 目标方法
* @param args 目标方法的形参
* @param methodProxy 代理方法
* @return
* @throws Throwable
*/
@Override
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
System.out.println("记录日志");
Object result = method.invoke(userDao, args);
return result;
}
});
//创建代理对象
UserDao proxy = (UserDaoImpl) enhancer.create();
proxy.saveUser();
}
动态代理的两种方式
最新推荐文章于 2023-08-13 16:36:19 发布