代理的概念
就是客户端直接使用的都是代理的对象,可以说是起到一个中介的作用
静态和动态的区别
静态:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。
动态:是在程序运行期间由JVM通过反射等机制动态的创建出代理对象的字节码。代理对象和真实对象的关系是在程序运行时才确定的。动态代理分为JDK动态代理与CGLIB动态代理,重点介绍JDK动态代理。
动态代理的实现案列
主要是jdk动态代理
1.代理的对象必须要实现接口
2.需要为每个对象创建代理对象
3.动态代理的最小单位是类(类中所有的方法都会被代理);
代码实现:
- 创建基本的dao和service包,实现接口以及实现类
- 创建事务类
public class Menger(){
publiic void begin(){
System.out.println("开始事务")
}
public void commion(){
System.out.println("提交事务");
}
public void stop(){
System.out.println("结束事务");
}
}
- 创建代理类
//动态代码的实现
prvate Object target;
public Object createProxy(Object object ){
this.target=target;
//动态代理三个参数1.类加载器 使用和目标对象一样的类加载器
//2.目标对象的接口
//2.代理对象执行方法要调用的处理程序
reture Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this)
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = method.invoke(this.target, args);//1.目标对象实例;2.方法参数----->就是相当于调用了目标对象的方法
return result;
}
最后创建测试类就ok了
静态代理
概念:在程序运行前就已经存在代理类的字节码文件,代理对象和真实对象的关系在运行前就确定了。
优点:
1.业务类只需要关注业务逻辑本身,保证了业务类的重用性。
2.把真实对象隐藏起来了,保护真实对象
缺点:
1.代理对象的某个接口只服务于某一种类型的对象,也就是说每一个真实对象都得创建一个代理对象。
2.如果需要代理的方法很多,则要为每一种方法都进行代理处理。
3.如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
静态代理不建议使用