å¨Springä¸å®ç°AOPæ ¹æ®çæ¬ä¸åï¼å¯ä»¥æ大è´åç§é
ç½®æ¹å¼ãç°ç®ååä¸ä¸ãå¨ä»ç»SpringçAOPé
ç½®æ¹å¼åï¼å
è¦æ³¨æSpringä¸Advisorçæ¦å¿µãå¨Springä¸Advisoræ¯AdviceåPointcutçç»åï¼ä½å®è¿ä¸æ¯AOPæ¦å¿µä¸çAspectãå 为å¨Springä¸Advisorè¿æ¯Springç¨æ¥çæAspect对象çä¸ä¸ªååï¼æ ¹æ®é
ç½®çä¸åï¼Springå¯ä»¥åªå¯¹æ个类çæAspectï¼ä¹å¯ä»¥å¯¹ææçç±»çæAspectã
1. åºäºxmlé
ç½®æ件ç代çé
ç½®æ¹å¼
è¿ç§æ¹å¼å¨2.0以åå¾å°ç¨äºï¼åå æ¯é
置项è¿å¤ï¼è¿äºç¹çãä½å¯¹äºç解Spring AOPè¿æ¯å¾æ帮å©ç
1.1 å®ä¹éç¥
<bean id="advice" class="yourAdviceImpl" />
1.2 å®ä¹åç¹
è¦å®ä¹ä¸ä¸ªåç¹ï¼å¯ä»¥éæ©ä½¿ç¨æ£å表达å¼æ¹å¼å£°æçåç¹æè
AspectJæ¹å¼å£°æçåç¹ã对æ£å表达å¼åç¹ï¼ä½¿ç¨Perl5RegexpMethodPointcutæJdkRegexpMethodPointcut(Java
1.4以ä¸çæ¬ï¼ä¸éè¦Jakarta OROçæ¯æäº)ï¼å¯¹AspectJåç¹ï¼ä½¿ç¨AspectJExpressPointcut
<bean id="pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
<property name="pattern" value="yourRegularExpression" />
</bean>
<bean id="pointcut" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="expression" value="yourAspectJExpression" />
</bean>
1.3 å®ä¹éç¥è
DefaultPointcutAdvisoræ¯Springæä¾çé»è®¤éç¥è
ï¼å®éè¦æä¾éç¥ååç¹çå¼ç¨ã
Springä¹æä¾äºRegexpMethodPointcutAdvisoråAspectJExpressionPointcutAdvisoræ¥å¯¹åºä¸¤ç§å£°æåç¹çæ¹å¼ï¼ä¸ç¨ååç¬å®ä¹åç¹ã
<bean id="advisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="advice" ref="advice" />
<property name="pointcut" ref="pointcut" />
</bean>
<bean id="advisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="advice" ref="advice" />
<property name="pattern" value="yourRegularExpression" />
</bean>
<bean id="advisor" class="org.springframework.aop.aspectj.AspectJExpressionPointcut">
<property name="advice" ref="advice" />
<property name="expression" value="yourAspectjExpression" />
</bean>
1.4 å®ä¹ProxyFactoryBean
<bean id="yourBean" class="org.springframework.aop.framework.ProxyFactoryBean>
<property name="target" ref="yourTargetBean" />
<property name="interceptorNames" value="advisor" />
<property name="proxyInterfaces" value="interfaceClass" />
</bean>
interceptorNamesåproxyInterfacesé½æ¯æ°ç»å±æ§ï¼æ以å¯ä»¥å£°æè¦ä½¿ç¨çä¸ä¸ªlistï¼ä¹å¯ä»¥è®©Springèªå¨æå个å¼è½¬å为æ°ç»
ä¸é¢æç¡®å®ä¹äºè¦å¯¹é£ä¸ªtargetBeanåºç¨ä»£ççæåé¢å®ä¾ãå¦æä¸æ³éå¶targetBeanï¼å¯ä»¥è®©Spring为ææå¹é
åç¹å£°æçbeançæåé¢å®ä¾ï¼è¿æ ·å°±ä¸ç¨ä¸ä¸ªä¸ªå®ä¹ProxyFactoryBeanäºï¼åªéè¦å®ä¹
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />
è¿æ¯ä¸ä¸ªBeanPostProcessorï¼æ以Springä¼èªå¨è¯å«å¹¶å¨beanç声æå¨æ使ç¨
2 å©ç¨2.0以å使ç¨aopæ ç¾
<aop:config>
<aop:aspect ref="">
<aop:pointcut id="performance" expression="execution(* *.perform(..))" />
<aop:before method="" pointcut-ref="performance" />
<aop:before method="" pointcut="execution(* *.perform(..))" />
<aop:after-returning method="" pointcut="execution(* *.perform(..))" />
<aop:after-throwing method="" pointcut="execution(* *.perform(..))" />
</aop:aspect>
</aop:config>
3 å©ç¨Annotation
3.1 å©ç¨@Aspectå°ä¸ä¸ªPOJO类声æ为ä¸ä¸ªåé¢ã
3.2 å®ä¹åç¹
@Pointcut("execution(* *.perform(..))")
public void performance(){}
éè¿@Pointcutå®ä¹çåç¹çååå°±æ¯å®æ注解çæ¹æ³çååï¼å æ¤ä¾åä¸çåç¹ååæ¯
performance()ãè¿é声æçperformance()æ¹æ³å®é
å£åªæ¯ä¸ä¸ªæ è®°ï¼ä¸º@Pointcutæä¾éå çç¹ï¼å¹¶ä¸è¦æ±æå®é
æä¹ã
3.3 å®ä¹éç¥
对è¦æ§è¡åé¢çæ¹æ³ï¼éè¿@Before("performance()"),@AfterReturning
("performance()")æ¥å®ä¹éç¥ã注æè¿éæä¾çåç¹å称ï¼æ¯performance(),èä¸æ¯performance
å¦æ对ä¸é¢ç两ç¹ä¸æ¯å¾ç解ï¼ä¹å¯ä»¥çç¥@Pointcutï¼èå°AspectJ表达å¼ç´æ¥å®ä¹å¨@Beforeçéç¥ä¸ï¼å°ä¸é¢ç两æ¥å为ä¸æ¥ï¼å¦@Before("execution(* *.perform(..))")
3.4 éç¥Springå建代ç
<aop:aspectj-autoproxy>
è¿å®é
ä¸ç¸å½äºå£°æäºä¸ä¸ªAnnotationAwareAspectJAutoProxyCreatorï¼ä»èæ ¹æ®@Pointcut声æçåç¹æ¥èªå¨ä»£çå¹é
çbeanå®ä¾
4 å¨Springä¸ç»åè¿AspectJ
对äºè¶
åºSpring AOPæ¯æèå´çï¼å¯ä»¥éç¨è¿ç§æ¹å¼ãåªéè¦å¨Springä¸é
ç½®AspectJçClasså®ä¾æ¶è®©Springè½å¤è·å¾AspectJç±»çå®ä¾å°±å¯ä»¥äºï¼æ¯å¦
<bean class="a_aspectj_class" factory-method="aspectOf">
<preperty .... />
</bean>
温馨提示:答案为网友推荐,仅供参考