Spring 的 AOP 是怎么实现的
时间: 2024-04-14 08:02:48 浏览: 5
Spring AOP的实现原理是基于动态代理技术,通过在运行时动态地生成代理对象来实现对原有对象进行增强。Spring AOP支持方法级别的拦截,通过在目标方法执行前、执行后或抛出异常时执行增强逻辑来实现横切关注点的分离。在实际应用场景中,可以通过Spring AOP实现事务管理、日志记录、权限认证等功能。
相关问题
spring aop java实现
Spring AOP的Java实现有两种方式: 编译时增强和运行时增强。编译时增强是在编译阶段生成代理类,其中AspectJ是一个基于Java实现的AOP框架,它有自己的编译器或织入器,需要使用AspectJ的编译器编译切面类才能执行。而运行时增强是在运行时动态生成代理类,其中JDK动态代理和CGLIB库是两种常用的实现方式。JDK动态代理只能代理接口,而CGLIB能代理接口和类,但不能代理被final修饰的类。JDK动态代理通过反射生成代理类,而CGLIB通过继承被代理类的方式生成代理类。Spring AOP使用了AspectJ的注解来定义切面、切入点、通知增强等,但没有使用AspectJ的代理类生成实现,所以不需要额外的AspectJ编译器或织入器。Spring AOP同时实现了通过JDK动态代理和CGLIB来生成代理类,当目标类实现了接口时,默认使用JDK动态代理,当目标类没有实现接口时,使用CGLIB。Spring AOP的切面类(用@Aspect注解标注的类)也是由IOC容器管理的Bean。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [理解Spring AOP实现与思想 案例代码](https://download.csdn.net/download/qq_37171817/12502814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *2* [Java自定义注解、Spring AOP、使用AOP实现和自定义注解实现日志记录](https://blog.csdn.net/suiyishiguang/article/details/126612592)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
- *3* [java AOP实现方式及Spring AOP总结](https://blog.csdn.net/wenqiangluyao/article/details/126309757)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"]
[ .reference_list ]
spring aop 是如何实现的
Spring AOP是基于动态代理实现的,它提供了两种代理方式:JDK动态代理和CGLIB动态代理。
1. JDK动态代理
JDK动态代理是基于接口的代理方式,它要求被代理对象必须实现一个接口,代理对象和被代理对象实现相同的接口,通过代理对象调用被代理对象的方法,并在方法调用前后进行增强。
Spring AOP使用JDK动态代理时,如果被代理的对象实现了接口,Spring AOP就会使用JDK动态代理来生成代理对象。代理对象实现了与目标对象相同的接口,因此可以将代理对象传递给任何期望目标对象的地方。
2. CGLIB动态代理
CGLIB动态代理是基于字节码的代理方式,它可以代理没有实现接口的类。CGLIB动态代理通过继承来实现代理,它创建目标对象的子类,并重写其中的方法来实现增强。
当目标对象没有实现接口时,Spring AOP会使用CGLIB动态代理来生成代理对象。代理对象继承了目标对象,并重写了目标对象的方法,因此可以将代理对象传递给任何期望目标对象的地方。
总之,Spring AOP通过使用动态代理技术,在运行时动态地代理目标对象,从而实现AOP功能。具体使用哪种代理方式,取决于被代理对象是否实现了接口。