面试的时候,你跟我说说spring AOP吧?
我就会不假思索的说,spring的AOP是基于动态代理,会生成一个代理对象,而这个代理对象
就会调用目标对象的方法,并在它的前后增加业务逻辑!!然后,就没了.......
如此 , 核心的概念就被我三言两语给盖过去了..........
所以,今天痛下决心,好好的钻研下AOP,力求能够全面,清晰的解释清楚!!
1. 关键字:
要解释清楚AOP,面向切面的编程!
那么 , 切面,代理对象,目标对象,编织,拦截 这五个概念一定要清楚!
说起AOP,首先想到的就是日志管理,我们想在某个方法调用的时候,将某些信息写入日志!
要达到我们的目的,可以通过直接在每个方法中都添加相同逻辑!
可是,这样明显不是合适的,共性太多,一些相同的逻辑在重复的书写,说明还可以抽象!
其二,如果你接下来,像修改写入日志的内容,那么不得不又重新的去修改每个方法!
耦合度太高!
既然刚说了有共性,那么就为什么不把这些代码抽象出来,成为一个单独的类!这个类就可以看成
一个切面!其实,对于切面,可以这样想,当一个方法执行时,它总是一步一步的
比如下面的testCompute() , 它实际作用的是compute() , 它应当也可以看成一个切面
log() 日志处理 , 也是这个方法的一部分 , ----- 切面 ,同样对于startTrancation() ;
void testCompute () { log(); startTrancation(); compute(); endTrancation(); log(); }
而原来那个要添加日志处理的类就是目标对象!
我们把切面与目标对象编织在一起 , 就会得到代理对象,它就是目标对象被切面增强后的对象!
当一个请求传过来的时候,代理对象就会拦截(控制对象访问) , 由它来处理相应的请求,它就会根据
配置信息,在原方法的前后添加逻辑,再调用目标对象的方法!
2. 怎么知道给那个类,那个方法,何时添加额外的逻辑?
通过定义:
Pointcut : 那些方法需要注入切面的行为!它是一个方法的集合
JoinPoint :连接点 一个pointcut 对应多个 joinPoint
Advice : 建议 , 你要添加的逻辑 ,可以指定位置!
Advisor :那个方法上定义那个advice
3. 怎么编织的,也就是说怎么得到代理对象的?
JDK动态代理机制 JDK动态代理实现原理 这篇文章分析的很清楚
从 Proxy 的静态方法 newProxyInstance() 入手,三个参数 : class[] interfaces , InvocationHandler handler ClassLoader loader
三者的作用:
interfaces 则是你要代理的接口 , 可以代理多个接口,但是必须是接口,不能为具体实现的类!
handler : 通过它里面的invoke 方法,你就可以为不同的方法,添加advice! 通过反射调用目标类中的方法
loader : 类加载环境
通过他生成的代理对象,是一个新的类,同样有相应的class文件!他的方法跟它代理的接口中的方法一样,因为它必须实现这些接口!
只是实现的时候,是调用handler中的invoke() 方法,这也是为什么下面invoke()是回调方法,当要调用目标类的
某个方法的时候,就会调用invoke方法!
其实这样看的话,代理类和目标类,都是实现了相同的接口,代理类在目标类的基础上对相应方法的实现增加了额外的操作!
但是,要知道一点,代理类的生成不是我们事先写好了的代码,而是在运行的时候动态的生成!它是一个新的类!与目标类不存在什么继承,
实现的关系!
cglib:
通过字节码操作!不局限于只能代理接口!
- CGLIB可以生成目标类的子类,并重写父类非final修饰符的方法(功能增强)。
4. 怎么拦截的?
当调用某个pointCut 指定的方法时,实质上调用的是代理类的这个方法,而代理类的实现就是通过调用,handler的invoke方法。
就像通过Jdk提供的代理模式一样,你必须实现InvocationHandler 接口 , 因为它里面
的回调方法关系到切面是否执行!
在Spring 的AOP中,我们不必自己实现InvocatiionHandler , 我们要做的就是定义切面
并在配置文件中告诉spring , 我要在这些方法(pointcut)的这些地方(before , after) 添加advice!
然后,spring就会把这些advice 添加到一个拦截器链中,就像过滤器一样!
回调方法invoke()调用的时候,就会使用这个拦截器链,然后,就会遍历这个拦截器链,看我这个
方法中是否第一你这个拦截器(advisor) , 然后就是一个递归调用的过程!
JdkDynamicProxy invoke():
// 把请求的方法 , 加入拦截器链中
List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);
5. 代理对象什么时候生成的?生命周期?
<context:annotation-config/> <context:component-scan base-package="com.bjsxt"/> <bean id = "litcpt" class="com.bjsxt.aop.LogInterceptor" /> <aop:config> <aop:aspect id="logAsp" ref="litcpt"> <aop:pointcut expression="execution(* com.bjsxt.dao..*.*(..))" id="pointCut"/> <aop:before method="Before" pointcut-ref="pointCut"/> </aop:aspect> </aop:config>
上面这种配置,初始化的时候,会生成DAO的代理吗?
会,初始化的时候就会生成!
启动spring容器时发生了什么:
- 实例化bean
- 解析aop:config的配置,当解析到切入点表达式时,将切入点表达式中的类和Spring容器中的类进行匹配,匹配成功生成代理对象(通知+目标方法)
- 在生成代理对象时,Spring会检查目标类有没有实现接口,如果有,采用JDK Proxy生成代理对象;没有则采用CGlib产生代理对象。
- 测试类中调用ctx.getBean时发生了什么:如果要取的bean有代理对象返回代理对象,没有则返回对象本身。
相关推荐
阿拉神农博客《Android深入理解Aop》的PDF版,也可以在https://blog.csdn.net/innost/article/details/49387395 该网站中直接观看,也可以下载下来保存
标题中的“Spring的Hello World:理解AOP”指的是在Spring框架中使用面向切面编程(Aspect-Oriented Programming,简称AOP)进行程序开发的基本概念和实践。面向切面编程是一种编程范式,旨在提高代码的可重用性和...
对于AOPAlliance,javadoc详细阐述了各个接口和类的功能、用法和注意事项,是理解AOPAlliance工作原理和实际应用的关键。 五、实践应用 使用AOPAlliance,开发者可以在Spring 2.0中定义自己的拦截器或通知,实现...
首先,理解AOP Alliance的含义至关重要。AOP Alliance是一个开源项目,旨在创建一个通用的API,使得不同的AOP框架可以无缝协作。它定义了一些核心的AOP概念,如拦截器(Interceptor)、通知(Advice)和切入点...
首先,我们要理解AOP的核心概念。AOP是一种编程范式,它允许开发者定义“切面”(Aspects),这些切面封装了特定的关注点,如日志、性能监控等。在运行时,这些关注点被编织到应用程序的主业务逻辑中,使得代码更...
Spring AOP 基础关于 AOP 是什么的理解 AOP(Aspect Oriented Programming 面向方面的编程)是一种实现横切面的工具,它是 OOP 的补充,而不是 OOP 的竞争对手。AOP 的出现是为了解决 OOP 中的缺陷,即 OOP 中的类...
首先,我们要理解AOP的核心概念:切面、连接点、通知和织入。切面是跨越多个对象的关注点的模块化,如日志或安全性。连接点是程序执行过程中可以插入切面的特定点,例如方法调用或属性访问。通知是在特定连接点上...
一、理解AOP概念 AOP的核心思想是将分散在各个模块中的交叉性代码(如日志、事务处理)抽取出来,形成独立的切面,以便于复用和维护。它提供了一种模块化的方式,使得我们可以专注于编写核心业务代码,而无需关心...
通过调试和分析测试结果,你可以更深入地理解AOP的工作原理和实际应用。 总之,仿Spring AOP框架提供了一个学习和实践AOP的平台,它涵盖了自定义注解、切面、通知等核心概念。通过动手实践,开发者可以更好地掌握...
通过查看和运行这个项目,开发者可以深入理解AOP如何与WCF服务协作,从而在实际项目中灵活应用这两种技术。 为了更深入地学习AOP和WCF,你可以参考链接中的博客文章(由于链接已过期,可能需要通过互联网搜索最新的...
首先,让我们理解AOP的基本概念。AOP是一种编程范式,它允许程序员定义“切面”,这些切面封装了特定的职责,例如日志记录或事务管理。在运行时,切面会与主业务逻辑“织入”在一起,以透明地执行其任务。 在Spring...
通过雷丰阳老师的Spring AOP课程,你将能够深入理解AOP的核心概念,并能熟练地在Spring项目中运用AOP技术,提升代码的整洁性和可维护性。文件"5.SpringAOP_01"和"6.SpringAOP_02"很可能是课程的分阶段内容,涵盖了从...
首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它包含了通知(Advice)和切点(Pointcut)。通知是在特定的连接点(Join Point)执行的代码,而切点则是定义这些连接点的规则,通常是一个方法调用。...
这个简单例子将帮助我们理解AOP的基本概念和如何在Spring框架中实现它。 首先,我们要知道AOP的核心概念:切面、通知、连接点、切点、目标对象和代理。切面是包含横切关注点(如日志记录、事务管理等)的模块化组件...
AOP(Aspect Oriented Programming,面向切面编程)是一种编程范式,旨在提高代码的可重用性、可维护性和模块化...此外,理解AOP还能帮助你在设计和重构过程中更好地分离关注点,使代码更符合SOLID原则,提高软件质量。
通过阅读和理解aopalliance的源码,我们可以更好地掌握AOP的核心思想,理解如何使用拦截器来增强代码,以及如何在不同AOP框架之间实现互操作。此外,这也为我们深入学习和应用Spring AOP、AspectJ等具体框架打下了...
C# AOP(面向切面编程)是...这样可以帮助你理解AOP是如何被用来增强MVC应用程序的,以及它是如何通过C#实现的。对于初学者来说,这是一个很好的实践案例,能够帮助他们理解这些高级概念,并将它们应用到自己的项目中。
首先,我们要理解AOP的核心概念。AOP是一种编程范式,它将关注点分离为“切面”(Aspects),每个切面封装了特定的横切关注点,如日志、事务管理、安全控制等。这些关注点可以在程序运行时自动插入到多个对象的方法...
首先,我们需要理解AOP的基本概念。AOP的核心是切面(Aspect),它封装了横切关注点,即那些影响多个类或操作的代码。切点(Join Point)是指程序执行过程中的特定点,如方法调用、属性访问等。通知(Advice)是在...
SpringBoot 整合 AOP 的实践与理解 在软件开发中,随着系统复杂性的增加,重复的代码和逻辑处理往往成为维护的痛点。为了解决这一问题,面向切面编程(Aspect-Oriented Programming,简称 AOP)应运而生。AOP 的...