Spring AOP入門(三)Annotationに基づく
ここでは、SpringのAOP機能を実現するためにAnnotationを使用する方法について説明します.
SpringのAOP機能をAnnotationで実現するには、いくつかのパッケージをインポートします.
aspectjrt.jar
aopalliance.jar
aspectjweaver.jar
1.まずbeans.xmlにaopのschemaを加える
2.AnnotationベースのAOP機能を開きます.
3.断面クラスを定義する-Declaring an aspect class
この場合、サービスレイヤの注入オブジェクトを変更する必要はありません.
しかしここでLogAsprctではメソッド名は取得されていませんが、メソッド名はどのように取得されますか?
4.JointPointによる取得方法
getTarget()->呼び出したクラスオブジェクトを返します.
Singature.getName()->呼び出しのメソッドを返します.
5.@After,@Aroundを設定
最終的にUserDaoのlistメソッドが呼び出され、実行結果は次のとおりです.
SpringのAOP機能をAnnotationで実現するには、いくつかのパッケージをインポートします.
aspectjrt.jar
aopalliance.jar
aspectjweaver.jar
1.まずbeans.xmlにaopのschemaを加える
xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
2.AnnotationベースのAOP機能を開きます.
<!-- Enables the use of the @AspectJ style of Spring AOP. -->
<aop:aspectj-autoproxy/>
3.断面クラスを定義する-Declaring an aspect class
package com.lj.proxy;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import com.lj.log.Logger;
@Component("logAspect") // Spring
@Aspect //
public class LogAspect {
/**
* advice
* execution(xx) pointcut
* * ,
* * ,
* add* add
* (..)
* || pointcut
*/
@Before(value = "execution(* com.lj.dao.*.add*(..))||"+
"execution(* com.lj.dao.*.update*(..))||"+
"execution(* com.lj.dao.*.list*(..))")
public void logStart(){
Logger.info(" ");
}
}
この場合、サービスレイヤの注入オブジェクトを変更する必要はありません.
@Service("userService")
public class UserService implements IUserService {
@Resource(name="userDao") // userDynamicDao,UserDynamicDao 。
private IUserDao userDao;
しかしここでLogAsprctではメソッド名は取得されていませんが、メソッド名はどのように取得されますか?
4.JointPointによる取得方法
public void logStart(JoinPoint jp){
//
System.out.println(jp.getTarget());
//Signature.getName()
System.out.println(jp.getSignature().getName());
Logger.info(" ");
}
getTarget()->呼び出したクラスオブジェクトを返します.
Singature.getName()->呼び出しのメソッドを返します.
5.@After,@Aroundを設定
//After
@After(value = "execution(* com.lj.dao.*.list*(..))")
public void endStart(JoinPoint jp) {
Logger.info(" ");
//
}
@Around(value = "execution(* com.lj.dao.*.list*(..))")
public void logAround(ProceedingJoinPoint proceedingJoinPoint){
Logger.info(" Around ");
try {
proceedingJoinPoint.proceed();
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
} //
Logger.info("Around ");
}
最終的にUserDaoのlistメソッドが呼び出され、実行結果は次のとおりです.