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方法他的参数是2个String方法 加入额外功能 * *.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、 AOP(aspect 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.创建一个对象
2.创建后置处理bean对象
3.将对象注入spring中
4.调用Cs对象drink()