侧边栏壁纸
博主头像
清如许博主等级

努力成长为一颗大树,一半洒落阴凉,一半沐浴阳光,非常沉默非常骄傲,从不依靠从不寻找

  • 累计撰写 80 篇文章
  • 累计创建 44 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录

使用代理模式实现Spring AOP的面向切面编程,动态代理的四种增强处理.md

清如许
2020-04-25 / 0 评论 / 0 点赞 / 193 阅读 / 3,503 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2020-10-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

什么是代理类?
代理就是代替我们去执行一些额外的工作。

目标类:只有核心功能的类

比如我们在写service的时候,调用dao方法是我们的核心业务而service类中的日志记录,事务处理,异常处理等都属于额外的功能,每个service方法中都要写一次这些额外功能也会造成大量代码的冗余,

而面向切面编程的意思就是说把这些公共的、额外的代码功能抽取出来,每个service里面只写我们的核心业务,这样就提高了我们的开发效率。

为什么代理类和目标类要实现相同的接口?
1.从代码的角度来说,代理类对象能够赋值给接口类型的变量
2.要保证代理类和目标类有相同的功能

有了代理类:
程序员可以只关心核心功能

额外功能+目标类 =代理类

以上这种说法就是叫做静态代理,
静态代理就是在代码编译时,代理类已经存在
好处:程序员可以只关心核心功能
不好:多个代理类 , 没有解决代码冗余的问题

什么是动态代理?

运行时,动态创建出来代理对象
SpringAOP通过动态代理,让程序猿只关心核心代码,同时代码不再冗余

springAOP的开发步骤:
1.写核心功能(目标类)
核心功能就是调用dao方法:
在这里插入图片描述
2.配置目标类
要在SpringApplication.xml文件中配置目标类所在路径

 <!--配置目标类-->
    <bean id="bookService" class="com.macw.serviceImpl.bookServiceImpl">
        <property name="bookDao" ref="bookDao"></property>
    </bean>

3.写额外功能(增强处理)
(公共功能:日志处理/事务处理/异常处理/性能分析....) 等

前置增强(MethodBeforeAdvice):在核心功能之前执行的额外功能
后置增强:在核心功能之后执行的额外功能

环绕增强:在核心功能之前以及之后执行的额外功能
异常增强:在核心功能发生异常时执行的额外功能

前置增强的配置使用:
1,声明一个类,需要实现 MethodBeforeAdvice接口:
在这里插入图片描述
2,spring配置文件中,配置声明的增强功能类

	<!--额外功能-->
   <bean id="myBeforeAdvice" class="com.macw.advice.myBeforeAdvice"></bean>

3,在spring配置文件中,通过aop标签做配置(需要添加aop命名空间以及schema验证文档):
.在哪些方法上面做增强处理
.在需要增强处理的方法上面,加哪个增强处理
在这里插入图片描述
4.让spring在运行的时候,帮我们创建代理对象()
在这里插入图片描述

详解advice
MethodBeforeAdvice前置增强的before方法

实现MethodBeforeAdvice接口必须要要实现before方法,这个方法有三个参数,
arg0:目标方法,
arg1:目标方法参数,
arg2:目标类,
在这里插入图片描述
2.AfterReturningAdvice:后置增强
在这里插入图片描述
3.ThrowsAdvice:异常增强
在这里插入图片描述
4.MethodInterceptor:环绕增强,目标方法执行之前以及之后做的增强处理
在这里插入图片描述
总结:
Spring AOP:Aspect Oriented Program 面向切面编程
几个重要概念:

1.切入点:需要把增强处理加在的位置;service层的方法上面;需要在配置文件中配置
2.增强处理:额外功能(公共功能) ,通知/建议(advice)
3.目标类:核心功能所在的类(原始类)
4.切面:把增强处理,放在切入点的位置,形成的一个概念
5.编织/织入:把增强处理放置在切入点的过程

AOP使用场景:
1.把功能内容抽取出来,形成advice;在配置文件中中做配置====>程序猿只关心核心功能;解决冗余
2.在原有功能基础之上,做功能扩展===>在不改变原有代码的基础上做功能扩展

AOP实现:代理模式的使用

代理类的产生原理
类加载ClassLoader
在这里插入图片描述

代理类的生成:由jdk动态代理生成
在这里插入图片描述

SpringAOP实现原理:

1.底层通过字节码技术,把目标对象以及额外功能动态封装,生成代理对象 ==>动态代理
使用了JDK动态代理以及cglib动态代理
2.为什么通过id得到的是代理对象
spring工厂创建对象之后,由BeanPostProcessor进行处理
在这里插入图片描述

0

评论区