■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書くと
設定簡単!なんだって・・・