代理模式代码示例:https://blog.csdn.net/weixin_39865508/article/details/141924680
代理模式的左右,一定程度上不暴露被代课对象的内容,更安全,也减少系统的耦合性
静态代理
-
代理对象和被代理对象都继承同一个接口
-
在代理对象的构造方法里,把被代理对象注入
-
在代理对象重写接口的方法里,调用被代理对象的方法, 并且在这个方法前后加代理对象自己的一些操作 ,比如加日志
动态代理
参考文档:htt在这里插入代码片
ps://zhuanlan.zhihu.com/p/69936638
public interface IUserService {
Object insert(Object obj);
}
public class UserServiceImp implements IUserService{
@Override
public Object insert(Object obj) {
System.out.println("插入对象:"+obj);
return obj;
}
}
public class Test {
public static void main(String[] args) {
//1、创建被代理的对象
IUserService userService=new UserServiceImp();
//2、创建InvocationHandler对象来执行代理逻辑
InvocationHandler invocationHandler=new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.print("具体处理的拦截方法:"+method.getName()+";其参数为:");
for (Object arg : args) {
System.out.println(arg+",");
}
long l = System.nanoTime();
System.out.println("被代理的方法开始执行..........");
Object result = method.invoke(userService, args);//输入被代理对象
long l1 = System.nanoTime();
System.out.println("被代理的方法执行结束,耗时(纳秒):"+(l1-l));
return result;
}
};
//3、创建代理对象
IUserService userServiceProxy=(IUserService) Proxy.newProxyInstance(userService.getClass().getClassLoader(), userService.getClass().getInterfaces(), invocationHandler);
//4、执行方法
userServiceProxy.insert("张三");
}
}
动态代理的应用
mybatis 中的应用 -mapppe 接口的使