Spring3.0で使うことを前提に書いています。
参考ページ http://d.hatena.ne.jp/minokuba/20110302/1299075764
参考ページ http://d.hatena.ne.jp/minokuba/20110302/1299075764
- AspectJのダウンロードページでLatest Stable Releaseにある最新jarファイルをダウンロード。
- ダウンロードしたjarファイルを解凍して、libフォルダ内のjarファイルを全てWEB-INF/libにコピー。
- OW2 Forgeから最新版のasm-X.X.bin.zipをダウンロード。
- ダウンロードしたファイルを解凍して、lib/allフォルダ内にあるasm-all-3.3.1.jarをWEB-INF/libにコピー。
- http://sourceforge.net/projects/aopalliance/files/...からaopalliance.zipをダウンロード。
- ダウンロードしたファイルを解凍して、aopalliance.jarをWEB-INF/libにコピー。
- http://sourceforge.net/projects/cglib/files/cglib2...から最新版のcglib-X.X.jarをダウンロード。
- ダウンロードしたファイルを'WEB-INF/lib''にコピー。
- 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>
- 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() { } }
- 実際のアクセプト処理。
- @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; } }
- アスペクトされる側の処理。
- 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("メソッド本体を実行!"); } }
- 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/
H2cc1K <a href="http://mmjixnltythw.com/">mmjixnltythw</a>, [url=http://rjiahbnqnbve.com/]rjiahbnqnbve[/url], [link=http://dqdnuithkjsd.com/]dqdnuithkjsd[/link], http://ifrekiufuthk.com/
ubtWiF <a href="http://oxaqccedjebk.com/">oxaqccedjebk</a>, [url=http://bfnyvaxqeotn.com/]bfnyvaxqeotn[/url], [link=http://lwqowjkksqxl.com/]lwqowjkksqxl[/link], http://vluyapfjaokx.com/
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