Spring AOP入門(三)Annotationに基づく


ここでは、SpringのAOP機能を実現するためにAnnotationを使用する方法について説明します.
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メソッドが呼び出され、実行結果は次のとおりです.
Spring AOP入门 (三)基于Annotation