类型名称:class com.sun.proxy.$Proxy9
要求: 要求被代理者,必须是接口或者是实现类
JDK代理是java原生提供的API无需导包
JDK动态代理在框架的源码中经常使用
CGlib动态代理CGlib特点说明
历史原因:JDK动态代理要求必须"有接口",但是某些类它没有接口,则无法使用JDK代理生成代理对象,所以为了填补知识的空缺,则引入cglib代理
问题说明: cglib动态代理 要求有无接口都可以创建代理对象 问题?
如何保证和被代理者"相同"?
答案:(特点)要求cglib动态代理继承被代理者 代理对象是被代理者的子类;
动态代理的作用?说明:一般我们将业务层中的耦合性高的代码,采用动态代理的方式进行解耦 ,使用程序更加具有扩展性(业务逻辑的解耦)
说明2:Spring专门针对动态代理的规则,封装了一套API起名AOP
Spring AOPAOP介绍
总结:Spring中的AOP利用代理对象在不修改源码的条件下对方法进行扩展
AOP中专业术语(难点)1).连接点: 用户可以被扩展的方法
2).切入点: 方法当满足切入点表达式时,就会执行通知方法
3).通知: 扩展方法的具体实现
4).切面: 将通知应用到切入点的过程
AOP入门案例
jar包导入
AOP形象化的比喻说明:AOP是一种抽象的一种概念,看不见/摸不着
面向切面编程 :将扩展的方法,在切面中进行定义封装,不需要修改源码 ,对方法进行扩展,并且切面可以有多个!!!
关于切入点表达式解析 bean标签写法@Pointcut(“bean(userServiceImpl)”) 只匹配ID为userServiceImpl的对象
within表达式@Pointcut(“within(com.jt.demo2.service.*)”) 匹配xx.xx.service下的所有对象
execution表达式 按照注解进行拦截自定义注解
通知方法 关于通知方法解析* 1.前置通知 在目标方法执行之前执行 * 2.后置通过 在目标方法执行之后执行 * 3.异常通知 在目标方法执行之后抛出异常时执行 * 4.最终通知 都要执行的通知 说明: 上述的四大通知一般用于记录程序的运行状态,只做记录 * 5.环绕通知 在目标方法执行前后都要执行的通知
前置通知
最终通知
说明: 不管方法
环绕通知
Spring中的通知总结第一类:记录程序的运行状态
1,前置通知
2,后置通知 记录目标方法的返回值
3,异常通知 记录目标方法执行之后,抛出异常的信息
4,最终通知 记录程序最后的状态
第二类:
5,环绕通知 控制目标方法是否执行,环绕通知是未来使用最多的,功能最为强大的
Spring中AOP案例需求1:需要对方法的执行时间,进行监视?
通知的选择:首选环绕通知
需求2:利用AOP可以实现缓存控制
通知类型:环绕通知
业务思路:
1用户直接查询缓存
如果缓存中没有数据 表示第一次查询 ,让目标方法执行
如果缓存中有数据 表示第N次查询,目标方法不执行 从缓存中获取数据即可
需求3:利用AOP控制事务
通知类型:环绕通知
需求4:利用AOP控制方法的权限!!!
通知类型: 环绕通知
业务思路:
1.在AOP环绕通知中,判断当前的用户是否有该权限!!!!
2.有权限 :可以执行目标方法,获取数据
3.没有权限 : 不能执行目标方法. :通知用户 没有权限!!!!
关于AOP现状说明:一般工作中很少直接编辑AOP底层代码,绝大部分的业务逻辑都是使用的 高级API ,不需要从底层写起
Spring中AOP的执行顺序说明说明:如果有多个环绕通知.其中
Srping总结知识总结:
Spring的作用:spring可以整合其他的第三方框架!从架构的角度,实现了代码的松耦合!
1.Spring-IOC/DI: IOC控制反转/数据结构Map集合
DI:依赖注入 类型注入/名称注入/一般接口都是单实现.
2.Spring-AOP 在不修改源码的条件下对方法进行扩展!!!
动态代理 : JDK动态/Cglib动态代理 method.invoke()
切面=切入点表达式+通知方法
AOP中因为切面较多,每个切面都完成特定的功能,所以一般不会研究顺序, @order注解 可以控制顺序



