トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

Java:SpringMVCでAOPする の変更点

Top / Java:SpringMVCでAOPする

*Java:SpringMVCでAOPする [#o8dfd31f]

SpringMVCでAOPをしようとしたときにしたときにちょっとハマったのでメモ。

***前提 [#q6b5e237]

-Spring3.1を使用
-SpringMVCは既に動作している状況

***依存ライブラリの追加 [#j6a32ed2]

以下の依存ライブラリをpomに追加します。

-spring-aop
-aspectjrt
-aspectjweaver
-cglib

        <dependency>
        	<groupId>org.springframework</groupId>
        	<artifactId>spring-aop</artifactId>
        	<version>${spring.version}</version>
        </dependency>
        <dependency>
        	<groupId>org.aspectj</groupId>
        	<artifactId>aspectjrt</artifactId>
        	<version>1.7.4</version>
        </dependency>
        <dependency>
        	<groupId>org.aspectj</groupId>
        	<artifactId>aspectjweaver</artifactId>
        	<version>1.7.4</version>
        </dependency>
        <dependency>
        	<groupId>cglib</groupId>
        	<artifactId>cglib</artifactId>
        	<version>2.2</version>
        </dependency>


***SpringBean定義への設定追加 [#z43f0ad8]

AOPするには、SpringMVCのDispatcherServletが読み込むBean定義に以下の内容が必要です。

-<context:component-scan .../>
-<mvc:annotation-driven />
-<context:annotation-config/>
-<aop:aspectj-autoproxy> </aop:aspectj-autoproxy>

ちなみに、小生の環境では、上2つはSpringMVCを動作させるために既に設定してあったので、下2つを追加しました。

***AOPするクラスを作成 [#r01e7804]

以下のサンプルはアノテーションベースです。

簡単な仕様は以下のとおり。
-PointCutはパッケージ名が*..controllerであるクラスのすべてのメソッドを対象
-AdviceはAround

 @Aspect
 @Component
 public class MyAspect {
 
 	@Around ("execution(* *..controller.*.*(..))")
 	public Object before(ProceedingJoinPoint pjp){
 		Log log = LogFactory.getLog(pjp.getSignature().getDeclaringType());
 		log.debug(pjp.getSignature() + ":" + pjp.getArgs() + "is called");		
 		Object ret = null;
 		try {
 			ret = pjp.proceed();
 		} catch (Throwable e) {
 			// TODO 自動生成された catch ブロック
 			log.error(e.getStackTrace(), e);
 		}
 		return ret;
 	} 	
 }

ちなみに、備忘のためにPointCutの構文を。

 execution(メソッドの修飾子▲メソッドの戻り値型▲パッケージ.クラスまたはインタフェース.メソッド名(引数の型 | 引数の型……)▲throws▲例外)

-メソッドの修飾子、パッケージ名、クラス名、throwsは省略可能
-パッケージをワイルドカードで指定する場合は、*..と記述する(*は.を含まないため)
-メソッドの引数に「..」を指定すると、何でも一致するようになる

***ちょっとハマったこと [#q70d0fd4]

最初は、依存関係に以下の3つしか入れてなくて、
-spring-aop
-aspectjrt
-aspectjweaver

こんなエラーが出ました。

 1 03, 2014 5:36:25 午後 org.springframework.web.servlet.FrameworkServlet initServletBean
 重大: Context initialization failed
 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'indexController' defined in file
 ………………………
 Initialization of bean failed; nested exception is org.springframework.aop.framework.AopConfigException: Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.

して、「cglib」を依存関係に足したらうまく行ったって感じでしたw