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

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

什么是代理类?

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


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


比如我们在写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进行处理

目录
相关文章
|
1月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
43 1
|
1月前
|
Java Spring 容器
Spring的AOP失效场景详解
Spring的AOP失效场景详解
112 0
|
30天前
|
设计模式 Java Maven
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
35 1
|
2天前
|
安全 Java Maven
[AIGC] Spring Boot中的切面编程和实例演示
[AIGC] Spring Boot中的切面编程和实例演示
|
13天前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
28 6
Spring高手之路17——动态代理的艺术与实践
|
14天前
|
Java 数据库 Spring
切面编程的艺术:Spring动态代理解析与实战
切面编程的艺术:Spring动态代理解析与实战
26 0
切面编程的艺术:Spring动态代理解析与实战
|
23天前
|
XML Java Maven
Spring之Aop的注解使用
Spring之Aop的注解使用
|
29天前
|
Java Spring
Spring 如何实现 AOP
Spring 如何实现 AOP
17 0
|
1月前
|
Java 编译器 程序员
Spring AOP 和 AspectJ 的比较
Spring AOP 和 AspectJ 的比较
37 0
|
1月前
|
Java Spring
【spring(三)】AOP总结
【spring(三)】AOP总结