AOP原理
spring用代理类包裹切面,把他们织入到Spring管理的bean中。也就是说代理类伪装成目标类,它会截取对目标类中方法的调用,让调用者对目标类的调用都先变成调用伪装类,伪装类中就先执行了切面,再把调用转发给真正的目标bean。
生活中的AOP
现在可以自己想一想,怎么搞出来这个伪装类,才不会被调用者发现(过JVM的检查,JAVA是强类型检查,哪里都要检查类型)。
实现和目标类相同的接口,我也实现和你一样的接口,反正上层都是接口级别的调用,这样我就伪装成了和目标类一样的类(实现了同一接口,咱是兄弟了),也就逃过了类型检查,到java运行期的时候,利用多态的后期绑定(所以spring采用运行时),伪装类(代理类)就变成了接口的真正实现,而他里面包 裹了真实的那个目标类,最后实现具体功能的还是目标类,只不过伪装类在之前干了点事情(写日志,安全检查,事物等)。
兄弟模式
生活解析
这就好比,一个人让你办件事,每次这个时候,你弟弟就会先出来,当然他分不出来了,以为是你,你这个弟弟虽然办不了这事,但是他知道你能办,所以就答应下来了,并且收了点礼物(写日志),收完礼物了,给把事给人家办了啊,所以你弟弟又找你这个哥哥来了,最后把这是办了的还是你自己。但是你自己并不知道你弟弟已经收礼物了,你只是专心把这件事情做好。
在兄弟模式中spring会使用JDK的java.lang.reflect.Proxy类,它允许Spring动态生成一个新类来实现必要的接口,织入通知,并且把对这些接口的任何调用都转发到目标类。
实际理论
JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
父子模式
生活解析
顺着这个思路想,要是本身这个类就没实现一个接口呢,你怎么伪装我,我就压根没有机会让你搞出这个双胞胎的弟弟,那么就用第2种代理方式,创建一个目标类的子类,生个儿子,让儿子伪装我。
生成子类调用,这次用子类来做为伪装类,当然这样也能逃过JVM的强类型检查,我继承的吗,当然查不出来了,子类重写了目标类的所有方法,当然在这些重写的方法中,不仅实现了目标类的功能,还在这些功能之前,实现了一些其他的(写日志,安全检查,事物等)。
这次的对比就是,儿子先从爸爸那把本事都学会了,所有人都找儿子办事情,但是儿子每次办和爸爸同样的事之前,都要收点小礼物(写日志),然后才去办真正的事。当然爸爸是不知道儿子这么干的了。 这里就有件事情要说,某些本事是爸爸独有的(final的),儿子学不了,学不了就办不了这件事,办不了这个事情,自然就不能收人家礼了。
在父子模式中spring使用CGLIB库生成目标类的一个子类,在创建这个子类的时候,spring织入通知,并且把对这个子类的调用委托到目标类。
实际理论
CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类。CGLIB是高效的代码生成包,底层是依靠ASM(开源的java字节码编辑类库)操作字节码实现的,性能比JDK强。
两种模式总结
相比之下,兄弟模式好些,它能更好的实现松耦合,尤其在今天都高喊着面向接口编程的情况下,父子模式只是在没有实现接口的时候,也能织入通知,应当做一种例外。
分享到:
相关推荐
Spring框架是Java开发中不可或缺的一部分,它通过提供依赖注入(Dependency Injection,简称DI)和面向切面编程(Aspect-Oriented Programming,简称AOP)等核心功能,极大地简化了企业级应用的开发工作。...
理解Spring AOP的实现原理对于优化代码和编写更高效的切面至关重要。 接着,Spring MVC是构建Web应用的重要部分。它基于Model-View-Controller设计模式,提供了处理HTTP请求、数据绑定、视图渲染等功能。Spring MVC...
《Spring Flex 深度解析:源于源码的探索》 Spring Flex 是 Spring 框架与 Adobe Flex 技术的结合体,旨在为开发者提供一个无缝集成的平台,用于构建富互联网应用程序(Rich Internet Applications,简称 RIA)。在...
Spring框架提供了强大的IoC(Inversion of Control)容器、AOP(Aspect Oriented Programming)支持、数据访问/集成、Web MVC等功能,使其成为Java开发领域的主流框架之一。 ### Spring框架的关键特性 #### ...
1. **Struts2和Spring3的整合原理** - **Struts2**:主要负责处理HTTP请求,通过Action映射到业务逻辑,返回结果视图。Struts2支持基于XML的配置和注解方式定义Action。 - **Spring3**:提供了强大的DI和AOP功能,...
2. **AOP(面向切面编程)**:Spring的AOP模块提供了声明式事务管理、日志记录等功能,允许开发者将关注点从业务逻辑中分离出来。在源码中,我们可以看到AspectJ的使用,以及如何通过代理模式实现切面的织入。 3. *...
2. **AOP(面向切面编程)**:Spring的AOP模块允许开发者定义横切关注点,并将其与业务代码分离,提高代码的可维护性和可复用性。 3. **Spring MVC**:Spring MVC是Web应用的模型-视图-控制器架构,源码分析可以...
此外,对于类似工具的替代方案,例如Java的JMX、Arthas或者Spring AOP等,也可以作为临时或长期的解决方案。它们提供了不同的方式来实现运行时的诊断和性能监控,可能更适合某些特定的场景。 总结起来,BTrace的`On...
在Spring Boot应用中,断路器是一个至关重要的概念,它帮助我们实现服务的容错管理,防止因某个服务故障导致整个系统的连锁反应。本篇文章将深入讲解如何在Spring Boot中集成并使用断路器,以Hystrix为例,提供详细...
- **跨平台原理**:Java 的跨平台特性源于其“一次编写,到处运行”的理念。它通过Java虚拟机(JVM)实现,JVM为不同操作系统提供了兼容的运行环境,使得Java代码能在任何支持JVM的平台上运行。 2. **面向对象编程...
10. **Spring框架**:作为最广泛应用的Java框架,Spring的IoC(控制反转)和AOP(面向切面编程)概念,以及Spring Boot和Spring Cloud的相关知识,都是面试中常见的问题。 11. **数据库相关**:SQL优化、事务处理、...
这一特性源于Java源代码被编译成字节码,这是一种中间表示,不依赖于特定硬件平台,而是由JVM负责解释执行。 JDK(Java Development Kit)是Java开发人员所需的工具集,包含JRE(Java Runtime Environment)以及...
这个问题源于一位初学者对于编程语言的理解困难,尤其是面对没有注释的Spring代码。实际上,编程语言的核心在于逻辑和算法,而非文字本身。然而,我们可以尝试探讨一下汉字在编程中的应用。 在Java中,尽管可以使用...
然而,根据题目描述的情况,一名拥有四年工作经验的应聘者在面试中未能获得16k薪资的职位,这可能源于他在某些关键领域的技术深度不足。下面我们将详细探讨应聘者的技能配置以及可能影响面试结果的因素。 首先,...
1. **Spring框架**:Java最流行的框架之一,用于构建企业级应用,包括依赖注入、AOP(面向切面编程)和MVC架构模式。 2. **JPA与Hibernate**:Java持久化API和其著名的实现Hibernate,用于简化数据库操作。 3. **...
以上只是Java庞大知识体系的一部分,深入学习Java还需要掌握更多的高级特性,如并发编程、性能调优、JVM内部原理等,并不断跟踪Java的最新发展,如Java 11、12、17等新版本带来的新特性和改进。通过不断的实践和学习...
这个称号可能源于它在单体架构模式下,集成了Spring、SpringMVC和MyBatis三个框架,导致系统复杂度增加,维护难度提升。在本文中,我们将深入探讨SSM-MyShop项目中的关键技术和知识点,以及为何这种架构被称为“地狱...
2. 框架开发:Spring框架中的依赖注入和AOP(面向切面编程)就大量使用了反射。 3. 测试工具:JUnit等测试框架通过反射来调用私有方法,进行单元测试。 4. 插件系统:允许插件在运行时与主程序交互,而无需预先...