Spring的动态代理


1、 Spring的动态代理

a) 概念:通过代理类为原始类增加额外功能

b) 好处:利于原始类维护

c) 开发步骤:
通过原始对象的ID值获得代理对象,代理对象与原始对象实现相同的接口。

1. 原始对象(核心功能)

2. 额外功能Advice
MethodBeforeAdvice 额外功能运行在原始方法执行之前【没有意义】
MethodIntercetpor【重点】

3. 切入点(pointcut
决定额外功能加入的位置。
<pointcut   exrepssion=””/>
切入点函数:execution()
切入点表达式:

1. 方法切入点,只关注于方法(不关心 类、包)
* *(..)  所有方法
login方法加入额外功能  * login(..)
login方法加入额外功能参数2个字符串参数  * login(String,String)
注意:参数类型不属于java.lang包,需要写权限定名
      * regiter(com.baizhi.User)
      * login(String,..)

2. 类切入点表达式 【关注于类】

UserServiceImpl中的login方法他的参数是2String方法 加入额外功能   * *.UserServiceImpl.login(String,String)

3. 包切入点【实战】

注意事项:上述写法只支持当前包,但不支持当前包的子包
如果既支持当前包,又支持当前包的子包
*  dynamic..*.*(..)

其他切入点函数:
    args() 专注于匹配参数

    within() 专注于匹配类 或者 包

切入点的逻辑运算 and  or  !
切入点函数 逻辑运算切入点函数
execution(* login(..)) or execution(* register(..))
注意:同种切入点函数间不能使用and运算
execution(* login(..)) and args(String,String)

 

4. 组装切面(advisor

2、 AOPaspect oriented program)面向切面编程

面向对象编程
以对象为基本单位的程序开发,通过对象间的彼此协同,相互调用,完成程序的构建。

面向过程编程
对过程(函数)为基本单位的程序开发,通过函数间的彼此协同,相互调用,完成程序的构建。

面向切面编程
以切面为基本单位的程序开发,通过切面间的彼此协同,相互调用,完成程序的构建。
切面 = 切入点 + 额外功能

1. 什么是AOP编程概念:
本质上就是Spring的动态代理开发,通过代理类为原始类增加额外功能。

2. AOP的好处
利于原始对象的维护

3. AOP编程的开发步骤

a) 原始对象

b) 额外功能 MethodInterceptor

c) 切入点

d) 组装切面

 

3、 AOP的底层实现(动态代理的底层实现)

a) 动态代理类 怎么创建出来的?
Proxy.newProxyInstance(ClassLoader,Interfaces,InvocationHandler);

代理 = 原始对象+额外功能+原始对象的接口


InvocationHandler:是额外功能,需要实现对应接口
 Interfaces:原始对象的接口
           原始对象的Class对象.getInterfaces();
 ClassLoader :借用其他类的类加载器 保证运行。

b) 动态代理类 怎么创建出来的(第二种方式)?
继承原始对象 创建代理
技术 Cglib
代理 = 原始对象 + 额外功能 + 继承父类

c) 为什么拿原始对象的id值 获得的是代理对象?

1. BeanPostProcesor 后置处理Bean
作用:把工厂生产的对象,进行再加工

a)  implements BeanPostProcessor

b) 配置文件



代码示例


1.创建一个对象

Spring的动态代理

2.创建后置处理bean对象

Spring的动态代理


Spring的动态代理

3.将对象注入spring中

Spring的动态代理

4.调用Cs对象drink()

Spring的动态代理