Spring aopの実現方式
1.xml構成に基づくspring aop
2.注記構成に基づくaop
AOPでよく用いられる実装方式は,宣言方式(XMLベース)と注釈方式(AspectJベース)の2つである.
まずAOPの重要な概念を復習します.
Joinpoint(接続点):プログラム実行時の特定のポイントでありSpringではメソッドの実行である.Pointcut(接点):一般的な点として、springにおけるAOPの接点はいくつかの方法の集合を指し、これらの方法は強化され、エージェントされる必要がある.一般的には、正規表現など、一定の規則に従って表されます.接点は接続点のクラスから構成されます. Advice(通知):やはり通俗的な点というか、指定の接点で何をするかです. Advisor(通知器):実は接点と通知の結合です.
一、XML構成に基づくSpring AOP
宣言方式で実装(XMLファイルで構成)し、大まかな手順は、プロファイルでpointcutを構成し、javaで実際のaspectクラスを記述し、切り込み点に関連する業務処理を行う.
うどん類:
package com.spring.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
public class AopAspect {
/**
* :
* @param jp
*/
public void doBefore(JoinPoint jp){
System.out.println("=========== ============");
}
/**
* :
*
* @param jp
* @param result
*/
public void doAfterReturning(JoinPoint jp,String result){
System.out.println("=========== ============");
System.out.println(" result==================="+result);
}
/**
* : ( )
* ,
* @param jp
*/
public void doAfter(JoinPoint jp){
System.out.println("=========== ============");
}
/**
*
* :
*
* @param jp
* @param ex
*/
public void doAfterThrowing(JoinPoint jp,Exception ex){
System.out.println("=========== ============");
}
/**
* : , 。
* (join point) 。 。
* proceed() , 。
*
* :ProceedingJoinPoint 。
* ,
* @param pjp
* @return
* @throws Throwable
*/
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("====== =========");
//
Object[] args = pjp.getArgs();
//
String method = pjp.getSignature().getName();
//
Object target = pjp.getTarget();
//
// proceed() ,
Object result=pjp.proceed();
System.out.println(" , :" + method + "; :" + target + "; :" + result);
System.out.println("====== =========");
return result;
}
}
<bean id="aspectBean" class="com.spring.aop.AopAspect" />
<aop:config>
<aop:aspect ref="aspectBean">
<aop:pointcut id="pointcut" expression="execution(* com.spring.service.impl.UserManagerServiceImpl..*(..))"/>
<aop:before method="doBefore" pointcut-ref="pointcut"/>
<aop:after-returning method="doAfterReturning" pointcut-ref="pointcut" returning="result"/>
<aop:after method="doAfter" pointcut-ref="pointcut" />
<aop:around method="doAround" pointcut-ref="pointcut"/>
<aop:after-throwing method="doAfterThrowing" pointcut-ref="pointcut" throwing="ex"/>
aop:aspect>
aop:config>
注記:
<aop:aspectj-autoproxy/>
@Aspect
public class AopAspectJ {
/**
* final String ,
*/
public static final String EDP="execution(* com.spring.service.impl.UserManagerServiceImpl..*(..))";
/**
*
*
* @param jp
*/
@Before(EDP)
public void doBefore(JoinPoint jp){
System.out.println("========= ==========");
}
/**
*
* returning
* @param jp
* @param result
*/
@AfterReturning(value=EDP,returning="result")
public void doAfterReturning(JoinPoint jp,String result){
System.out.println("=========== ============");
}
/**
* : ( )
* @param jp
*/
@After(value=EDP)
public void doAfter(JoinPoint jp){
System.out.println("=========== ============");
}
/**
* : , 。
* @param pjp
* @return
* @throws Throwable
*/
@Around(EDP)
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("====== =========");
//
Object[] args = pjp.getArgs();
//
String method = pjp.getSignature().getName();
//
Object target = pjp.getTarget();
//
// proceed() ,
Object result=pjp.proceed();
System.out.println(" , :" + method + "; :" + target + "; :" + result);
System.out.println("====== =========");
return result;
}
/**
* ,
* @param jp
* @param ex
*/
@AfterThrowing(value=EDP,throwing="ex")
public void doAfterThrowing(JoinPoint jp,Exception ex) {
System.out.println("=========== ============");
}
}