■SpringでAOPをやるには!
・ポイントカット:XMLにかく
→便利なポイントカットも用意してくれているよ!
・アドバイス:インターセプタという
■ほかのAOPとの比較
・Springだと、プロキシベース,ポイントカットはBean定義ファイル、インターセプタは、Javaクラス
・しーさー、JBossは、aroundしかないお
・AspectJは、特殊な言語で書くお、バイトベースだお
→バイトコードレベルとか、プロキシとか:ウィーブするところをさしている
■やり方の例
0.もともと、書きたいプログラムがあったとする
(MyAopDiImpl.java これ以外に、IAopDi.javaも存在する)
・インターフェースになっていないと、できない。インターフェースにしてることだいじ
package sample; public class MyAopDiImpl implements IAopDi { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
1.インターセプションしたいクラスをかこう!
(MyBeforeAdviceInterceptor.java)
import java.lang.reflect.Method; import org.springframework.aop.MethodBeforeAdvice; public class MyBeforeAdviceInterceptor implements MethodBeforeAdvice { public void before(Method arg0, Object[] arg1, Object arg2) throws Throwable { System.out.println("Hi!!"); }
Before用にMethodBeforeAdviceみたいに、アドバイスのクラスがいろいろ用意されている
2.getBeanするところを書く
(sample.java等、mainメソッドの中)
WebApplicationContext context = WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()); IAopDi obj = (IAopDi) context.getBean("myFactoryBean"); out.println(obj.toString());
3.設定ファイルを書く
(applicationContext.xml等、設定ファイルのxml)
<bean id="myFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="proxyTargetClass"><value>false</value></property> <property name="proxyInterfaces"><value>sample.IAopDi</value></property> <property name="target"><ref local="obj"/></property> <property name="interceptorNames"><value>myAdvisor</value></property> </bean> <bean id="myAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor"> <property name="advice"><ref local="myInterceptor"/></property> <property name="pattern"><value>.*get.*</value></property> </bean> <bean id="myInterceptor" class="sample.MyBeforeAdviceInterceptor"/> <bean id="obj" class="sample.MyAopDiImpl"/>
(< >は、本当は半角)
これで、実行すると、いいらしい・・・
■Autoproxy書くと
設定簡単!なんだって・・・