什么是代理?
客户,房东,中介
客户有租房的需求,房东有租房的行为。中介就相当于一个代理
当对用户进行服务时,中介除了能完成房东的所有服务,还能提供额外 的服 务比如在租给用户房子前可以带用户看房给用户介绍房子,租给用户房子后 还可以收取额外的中介费用,这就是一个代理的过程
传统模式-->静态代理模式-->动态代理模式-->AOP面向切面编程
传统模式:
1.将处理事务或其他额外服务的代码和专门处理业务的service层严重的耦合在了一起,降低了程序的可扩展性,增加了后期程序的维护难度
2.有许多重复的代码,只要一需要添加相同的事务就出现重复的代码
静态代理模式:
其实就是一种思想
1.解决了传统模式的第一个缺点,将处理事务的代码和处理业务的代码实现了分离,使程序的的结构变得清晰整洁
2.但是静态代理得为每个需要添加事务的类都创建一个代理类,代码重复性问题得不到解决
动态代理模式:
1.既解决了处理业务的代码和处理事务的代码之间的耦合性过高问题
又解决了代码的重复性问题
2.动态代理分为JDK动态代理和cglib动态代理。JDK动态代理需要被代理对象必须实现接口,而cglib动态代理不需要被代理对象必须实现接口
但要求其动态代理类是被代理类的的子类。JDK动态代理的运行速度高于cglib动态代理
JDK动态代理原理:
其原理是根据java反射技术动态的根据目标对象创建出对应的代理对象
Proxy的invoke()方法通俗来说其实就是起到一个拦截的作用当目标对象执行此方法时会执行一些额外的操作例如事务操作
Cglib动态代理原理:
原理和jdk原理基本类似。
无论是jdk动态代理还是cglib动态代理一个代理类只能处理一类事务
AOP面向切面编程:
AOP通俗来说也实现了动态代理的全部功能并且更为强大,能做各种额外的 操作
AOP执行原理:
1.当目标对象执行其方法时如果满足切点中的匹配规则则spring根据反射技术根据目标对象为其创建代理对象。
2.若目标对象实现了接口则为其创建jdk代理对象反之创建cglib代理对象
3.代理对象执行方法时不仅会执行被代理对象里的全部代码,还会执行匹配到的通知里的操作.(这就是AOP的真正意义所在)
AOP的结构:
切点:是一种匹配机制,如果目标对象执行方法是符合切点中的匹配规则则为其创建代理对象不仅执行目标对象里的操作还额外执行通知里的操作。
通知:完成某些额外操作的代码的集合
切面:完成某些特定功能的类,若干通知的集合
ProceedingJoinpoint连接点:通知与目标对象执行的方法的桥梁,通过连接点可以再通知里调用目标方法,获取目标方法的参数,获取目标对象的类型,获取目标对象执行的方法的名字等等