1.ç»èAOPç论
2.Spring实战——面向切面的源码Spring1.5使用注解创建切面
3.AOP 相关术语
ç»èAOPç论
1ãä»ä¹æ¯AOP
AOP(Aspect Orient Programming) : é¢ååé¢ç¼ç¨
Aspect ï¼è¡¨ç¤ºåé¢ï¼ ç»ä¸å¡æ¹æ³å¢å çåè½ï¼å«ååé¢ã åé¢ä¸è¬é½æ¯éä¸å¡åè½ï¼ èä¸åé¢åè½ä¸è¬é½æ¯å¯ä»¥å¤ç¨çã ä¾å¦ æ¥å¿åè½ï¼ äºå¡åè½ï¼ æéæ£æ¥ï¼åæ°æ£æ¥ï¼ ç»è®¡ä¿¡æ¯ççã
Orientï¼é¢åï¼å¯¹ç
Programmingï¼ç¼ç¨ã
2ã æä¹ç解é¢ååé¢ç¼ç¨ ï¼ ä»¥åé¢ä¸ºæ ¸å¿è®¾è®¡å¼åä½ çåºç¨ã
1ï¼è®¾è®¡é¡¹ç®æ¶ï¼ æ¾åºåé¢çåè½ã
2ï¼å®æåé¢çæ§è¡æ¶é´ï¼ æ§è¡çä½ç½®ã
3ãAOPçä½ç¨ï¼
1ï¼è®©åé¢åè½å¤ç¨
2ï¼è®©å¼å人åä¸æ³¨ä¸å¡é»è¾ã æé«å¼åæç
3ï¼å®ç°ä¸å¡åè½åå ¶ä»éä¸å¡åè½è§£è¦åã
4ï¼ç»åå¨çä¸å¡æ¹æ³ï¼ å¢å åè½ï¼ä¸ç¨ä¿®æ¹åæ¥ç代ç
4ãAOPä¸æ¯è¯
1ï¼Aspectï¼åé¢ï¼ ç»ä¸å¡æ¹æ³å¢å çåè½ã
2ï¼JoinPoint:è¿æ¥ç¹ï¼ è¿æ¥åé¢çä¸å¡æ¹æ³ã å¨è¿ä¸ªä¸å¡æ¹æ³æ§è¡æ¶ï¼ä¼åæ¶æ§è¡åé¢çåè½ã
3ï¼Pointcut: åå ¥ç¹ï¼ æ¯ä¸ä¸ªæå¤ä¸ªè¿æ¥ç¹éåã 表示è¿äºæ¹æ³æ§è¡æ¶ï¼é½è½å¢å åé¢çåè½ã
表示åé¢æ§è¡çä½ç½®ã
4ï¼target: ç®æ å¯¹è±¡ï¼ ç»é£ä¸ªå¯¹è±¡å¢å åé¢çåè½ï¼ è¿ä¸ªå¯¹è±¡å°±æ¯ç®æ 对象ã
5ï¼Adviceï¼éç¥ï¼å¢å¼ºï¼ï¼è¡¨ç¤ºåé¢çæ§è¡æ¶é´ã å¨ç®æ æ¹æ³ä¹åæ§è¡åé¢ï¼è¿æ¯ç®æ æ¹æ³ä¹åæ§è¡åé¢ã
AOPä¸éè¦çä¸ä¸ªè¦ç´ ï¼ Aspectï¼ Pointcut , Advice. è¿ä¸ªæ¦å¿µçç解æ¯ï¼ å¨Adviceçæ¶é´ï¼å¨Pointcutçä½ç½®ï¼ æ§è¡Aspect
AOPæ¯ä¸ä¸ªå¨æçææ³ã å¨ç¨åºè¿è¡æé´ï¼å建代çï¼ServcieProxyï¼ï¼ä½¿ç¨ä»£çæ§è¡æ¹æ³æ¶ï¼å¢å åé¢çåè½ãè¿ä¸ªä»£ç对象æ¯åå¨å åä¸çã
5ãä»ä¹æ¶åä½ æ³ç¨AOP
ä½ è¦ç»æäºæ¹æ³ å¢å ç¸åçä¸äºåè½ã æºä»£ç ä¸è½æ¹ã ç»ä¸å¡æ¹æ³å¢å éä¸å¡åè½ï¼ä¹å¯ä»¥ä½¿ç¨AOP
6ãAOPææ¯ææ³çå®ç°
使ç¨æ¡æ¶å®ç°AOPã å®ç°AOPçæ¡æ¶æå¾å¤ã æåç两个
1ï¼ Spring ï¼ Springæ¡æ¶å®ç°AOPææ³ä¸çé¨ååè½ã Springæ¡æ¶å®ç°AOPçæä½æ¯è¾ç¹çï¼æ¯éã
2ï¼ Aspectj ï¼ ç¬ç«çæ¡æ¶ï¼ä¸é¨æ¯AOPã å±äºEclipse
7ãéç¥
Aspectj表示åé¢æ§è¡æ¶é´ï¼ç¨çéç¥ï¼Adviceï¼ã è¿ä¸ªéç¥å¯ä»¥ä½¿ç¨æ³¨è§£è¡¨ç¤ºã
讲5ä¸ªæ³¨è§£ï¼ è¡¨ç¤ºåé¢ç5个æ§è¡æ¶é´ï¼ è¿äºæ³¨è§£å«åéç¥æ³¨è§£ã
@Before ï¼ åç½®éç¥
@AfterRetunringï¼ åç½®éç¥
@Around: ç¯ç»éç¥
@AfterThrowing:å¼å¸¸éç¥
@After:æç»éç¥
8ãPointcut ä½ç½®
Pointcut ç¨æ¥è¡¨ç¤ºåé¢æ§è¡çä½ç½®ï¼ 使ç¨Aspectjä¸åå ¥ç¹è¡¨è¾¾å¼ã
Spring实战——面向切面的Spring1.5使用注解创建切面
使用注解创建切面是Spring实战中的重要技巧,它简化了AspectJ 5以前繁琐的源码Java语言扩展,使得任何类可以轻易转换为切面。源码通过定义切面,源码我们可以将非核心关注点(如观众的源码行为)与核心功能分离,提高代码的源码易语言qq飞车辅助源码可维护性。
在定义切面时,源码首先使用@AspectJ注解标记Audience类,源码其中的源码三个通知方法(takeSeats, silence CellPhones, applause, demandRefund)利用@Before, @AfterReturning, @AfterThrowing注解表明执行时机。这些注解都引用了一个切点表达式,源码但重复使用可能会显得冗余。源码为了解决这个问题,源码@PointCut注解允许我们在切面内部定义可重用的源码切点,如performance()方法。源码
Audience作为注解切面,源码通过Spring自动代理功能,当装配为bean时,api程序源码例子其注解通知将自动应用到匹配的bean上。启用自动代理的方式可以是JavaConfig或XML配置。Spring的AspectJ自动代理实际上是一个基于代理的实现,尽管使用了注解,但它仍然局限于代理方法的调用。
要充分利用AspectJ的能力,需要在运行时启用AspectJ,而不是himall2.4源码依赖Spring。环绕通知是强大的,它可以包裹目标方法,实现前置和后置通知的组合。通过创建一个环绕通知,如watchPerformance(),我们可以在一个方法中统一处理前后行为。
切面处理参数的方法可以是通过参数化的通知,如记录磁道播放次数的驱动程序源码TrackCounter切面。引入新功能可以通过AOP的引入概念,为Spring bean添加新的方法,即使这些方法在原始实现中不存在。
总的来说,注解创建切面提供了简洁的编程方式,但源码的可访问性是其使用的一个前提。在Spring中,注解和自动代理简化了切面声明,网页反馈源码但也需要一定的条件。
AOP 相关术语
AOP中,关键术语的解释如下:
连接点(Joinpoint): 在Spring框架中,这些指的是被拦截的对象,特别是方法,因为Spring主要支持的是方法级别的连接点。简单来说,它是目标对象中所有可被拦截的点。
切入点(Pointcut): 定义了我们希望对哪些连接点进行拦截的范围。这个概念帮助我们确定哪些方法需要增强或修改行为。
通知(Advice): 是AOP的核心,拦截到连接点后,通知定义了后续的操作。包括前置通知(在方法执行前执行)、后置通知(在方法执行后执行)、异常通知(处理方法异常)、最终通知(无论方法执行结果如何都会执行)和环绕通知(围绕方法执行的完整流程)。
引介(Introduction): 是一种特殊的通知,它能在不修改类源代码的情况下,为类动态添加方法或字段,提供了一种灵活的扩展方式。
目标对象(Target): 是代理的目标,即原始的对象或被代理的对象,即通知增强的对象。
织入(Weaving): 是将增强应用到目标对象,生成新代理对象的过程。Spring使用动态代理实现织入,而AspectJ则支持编译期和类装载期的织入方式。
代理(Proxy): 一个对象经过AOP的增强后,会生成一个新的代理对象,用于包裹和增强原始对象的行为。
切面(Aspect): 最终,切面是切入点(Pointcut)和通知(Advice)的结合体,它定义了何时何地以及如何执行通知。通过切面,我们能够实现代码的解耦和模块化增强。