Spring3.0で使うことを前提に書いています。
参考ページ http://d.hatena.ne.jp/minokuba/20110302/1299075764



JARファイルダウンロード

aspectj-X.X.X.jar関係

aspectjrt.jar
aspectjtools.jar
aspectjweaver.jar
org.aspectj.matcher.jar
  • AspectJのダウンロードページLatest Stable Releaseにある最新jarファイルをダウンロード。
  • ダウンロードしたjarファイルを解凍して、libフォルダ内のjarファイルを全てWEB-INF/libにコピー。

asm-all-X.X.X.jar

  • OW2 Forgeから最新版のasm-X.X.bin.zipをダウンロード。
  • ダウンロードしたファイルを解凍して、lib/allフォルダ内にあるasm-all-3.3.1.jarWEB-INF/libにコピー。

aopalliance.jar

cglib-X.X.jar



設定ファイル

Bean定義ファイル(application.xml)

  • Springアノテーションの使用のBean定義ファイル(application.xml)に★の行と▼から▲までを追加する。
  • <context:component-scan>で設定したパッケージ以下にある@AspectアノテーションがついたクラスがSpringAOPで管理される。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
★	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
	xsi:schemaLocation="
	http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
★    http://www.springframework.org/schema/aop 
★    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
	">
	
	<!-- プロパティファイルを認識させる -->
	<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list><value>classpath:config.properties</value></list>
		</property>
	</bean>
<!-- 略 -->
	<!-- Springアノテーションを有効にする -->
	<context:component-scan base-package="jp.holenews.w2u.sample"/>
<!-- ▼ここから -->
	<!-- AspectJアノテーションを有効にする-->
	<aop:aspectj-autoproxy/>
	<context:component-scan base-package="jp.holenews.w2u.sample">
		<context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect" />
	</context:component-scan>
<!-- ▲ここまで -->
</beans>

プログラムソース

詳しい説明は一番上に書いた参考ページを見てください。
そこからソースパクってます。

SystemArchitecture.java

  • Aspectを適用する箇所を定義する。
  • 実際にこの定義を使うときは、↓のAccessAdvice.javaの@Aroundアノテーションで指定した方法で。
package jp.holenews.w2u.sample.aop;
import org.aspectj.lang.annotation.*;
@Aspect
public class SystemArchitecture  {
	/**Service層のメソッド呼び出し*/
	@Pointcut("execution(* jp.holenews.w2u.sample.service.*.*(..))")
	public void businessService() {
		
	}
}

AccessAdvice.java

  • 実際のアクセプト処理。
  • @Aroundをつけるとメソッドの前後に埋め込まれる形になる。@Beforeとか@Afterもあるけど略。
    • 第一引数にProceedingJoinPointを用意する。ここに呼び出すメソッドの情報がある。proceed()で処理実行。
  • @AroundにはAspectJ形式の指定もできるけど、↑のSystemArchitectureクラスで定義しておいたメソッドを指定する方が便利。
package jp.holenews.w2u.sample.aop;
import org.apache.log4j.Logger;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

@Aspect
public class AccessAdvice {

    @Around("jp.holenews.w2u.sample.aop.SystemArchitecture.businessService()")
    public Object  outputLog(ProceedingJoinPoint pjp) throws Throwable{
	Logger.getLogger(getClass()).debug(pjp.getSignature().getName() + "より前にログ出力");
        Object o = pjp.proceed();
        Logger.getLogger(getClass()).debug(pjp.getSignature().getName() + "より後にログ出力");
        return o;
    }
}

SampleService.java

  • アスペクトされる側の処理。
    • jp.holenews.w2u.sample.serviceパッケージに含まれているので、SystemArchitecture.javaの@PointCutで指定したパターンと一致する。
    • doSomething()の前後にAccessAdviceの処理が呼び出される。
  • @ComponentについてはSpringアノテーションの使用を参照。
package jp.holenews.w2u.sample.service;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Component;

@Component
public class SampleService {

	public void doSomething(){
		Logger.getLogger(getClass()).debug("メソッド本体を実行!");
	}
}

SampleController.java

  • SampleServiceを呼び出す側。AOPとは直接は関係ない。
package jp.holenews.w2u.sample.controller;
import jp.holenews.w2u.sample.service.SampleService;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.*;

@Component
public class SampleController {
	
	@Autowired
	private SampleService sampleService;
	
	public void callService(){
		Logger.getLogger(getClass()).debug("メソッドを呼び出すよ");
		sampleService.doSomething();
		Logger.getLogger(getClass()).debug("メソッドを呼び出し終わったよ");
	}

	// (略) sampleServiceのsetter 
}

実行結果

00:54:34,039 DEBUG SampleController                 - メソッドを呼び出すよ
00:54:34,039 DEBUG DefaultListableBeanFactory       - Returning cached instance of singleton bean 'accessAdvice'
00:54:34,039 DEBUG AccessAdvice                     - doSomethingより前にログ出力
00:54:34,070 DEBUG SampleService                    - メソッド本体を実行!
00:54:34,070 DEBUG AccessAdvice                     - doSomethingより後にログ出力
00:54:34,070 DEBUG SampleController                 - メソッドを呼び出し終わったよ
  • SampleControllerがSampleServiceを呼んだだけだが、AOPによりAccessAdviceの処理が埋め込まれていることが分かる。

このページへのコメント

S1YttT <a href="http://mzsrktdtkmtm.com/">mzsrktdtkmtm</a>, [url=http://dygrcmepvbsf.com/]dygrcmepvbsf[/url], [link=http://hraibtvkuozt.com/]hraibtvkuozt[/link], http://yzvaktadpcot.com/

0
Posted by oyrjou 2013年11月20日(水) 08:56:17 返信

H2cc1K <a href="http://mmjixnltythw.com/">mmjixnltythw</a>, [url=http://rjiahbnqnbve.com/]rjiahbnqnbve[/url], [link=http://dqdnuithkjsd.com/]dqdnuithkjsd[/link], http://ifrekiufuthk.com/

0
Posted by kgahprgu 2013年11月14日(木) 16:24:19 返信

ubtWiF <a href="http://oxaqccedjebk.com/">oxaqccedjebk</a>, [url=http://bfnyvaxqeotn.com/]bfnyvaxqeotn[/url], [link=http://lwqowjkksqxl.com/]lwqowjkksqxl[/link], http://vluyapfjaokx.com/

0
Posted by feikxs 2013年07月08日(月) 05:55:55 返信

Individuals who would likely surrender crucial liberty to acquire slightly temporary protection, ought to get none freedom nor safety. Arch Support Inserts http://www.deelsonheels.com/$1449_High_Heel_Arch_Support_Inserts/p133745_662770.aspx

0
Posted by Arch Support Inserts 2013年05月24日(金) 19:30:47 返信

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

メンバーのみ編集できます