1.【Spring实战——面向切面的Spring】1.5使用注解创建切面
2.ç»èAOPç论
【Spring实战——面向切面的Spring】1.5使用注解创建切面
使用注解创建切面是Spring实战中的重要技巧,它简化了AspectJ 5以前繁琐的Java语言扩展,使得任何类可以轻易转换为切面。通过定义切面,修改源码无效链接我们可以将非核心关注点(如观众的行为)与核心功能分离,提高代码的可维护性。
在定义切面时,首先使用@AspectJ注解标记Audience类,其中的三个通知方法(takeSeats, silence CellPhones, applause, demandRefund)利用@Before, @AfterReturning, @AfterThrowing注解表明执行时机。这些注解都引用了一个切点表达式,但重复使用可能会显得冗余。radasm 源码环境为了解决这个问题,@PointCut注解允许我们在切面内部定义可重用的切点,如performance()方法。
Audience作为注解切面,通过Spring自动代理功能,排名程序源码当装配为bean时,其注解通知将自动应用到匹配的bean上。启用自动代理的方式可以是JavaConfig或XML配置。Spring的AspectJ自动代理实际上是一个基于代理的实现,尽管使用了注解,棋盘源码论坛但它仍然局限于代理方法的调用。
要充分利用AspectJ的能力,需要在运行时启用AspectJ,而不是依赖Spring。环绕通知是茶叶溯源码强大的,它可以包裹目标方法,实现前置和后置通知的组合。通过创建一个环绕通知,如watchPerformance(),我们可以在一个方法中统一处理前后行为。
切面处理参数的方法可以是通过参数化的通知,如记录磁道播放次数的TrackCounter切面。引入新功能可以通过AOP的引入概念,为Spring bean添加新的方法,即使这些方法在原始实现中不存在。
总的来说,注解创建切面提供了简洁的编程方式,但源码的可访问性是其使用的一个前提。在Spring中,注解和自动代理简化了切面声明,但也需要一定的条件。
ç»è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ä¸åå ¥ç¹è¡¨è¾¾å¼ã