Spring AOPサンプルアプリでAOPを理解する : Spring Frameworkで理解するDI(3) (2/3 ページ)
リスト1 以下に示すコードを作成し、SpringTestクラスのmainメソッドを実行すると、以下のように表示されます。
サンプルの実行結果
メソッド実行前
Helloworld
メソッド実行後
HelloWorldBeanImplクラスには、「Helloworld」という文字列を出力するコードしか記述されていませんが、SpringAOPによってインターセプターに記述されたメソッド前後の処理(文字列「メソッド実行前」と「メソッド実行後」の出力)を挿入することができました。
リスト1 以下のサンプルで分かるように、オブジェクトの定義や呼び出し元の呼び出し方法などをまったく変えることなく、メソッドに処理を追加することができるのがAOPです。このAOPをインフラストラクチャに採用することで、ビジネスロジックとは関係のない処理を分離したり、アーキテクチャの部分だけを改修や強化したりすることができるようになります。またビジネスロジックから分離されたインフラストラクチャだけを再利用することも可能になります。AOPは、まさにインフラストラクチャに適した仕組みといえます。このAOPによってDIコンテナは、さらに柔軟性を強化できるのです。
リスト1 IHelloWorldBean.java インターフェイス
public interface IHelloWorldBean {
public abstract String getName();
public abstract void setName(String name);
public abstract void helloworld();
}
リスト2 HelloWorldBeanImpl.java
public class HelloWorldBeanImpl implements IHelloWorldBean {
public HelloWorldBeanImpl() {}
private String name;
public String getName() {return name;}
public void setName(String name) {this.name = name;}
public void helloworld() {
System.out.println("Helloworld");
}
}
リスト3 MyMethodIntercepter.java
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
public class MyMethodIntercepter implements MethodInterceptor{
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("メソッド実行前");
Object result = invocation.proceed();
System.out.println("メソッド実行後");
return result;
}
}
リスト4 applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">(実際には1行)
<beans>
<bean id="helloWorldBeanImpl" class="HelloWorldBeanImpl" >
<property name="name" >
<value>名前</value>
</property>
</bean>
<bean id="helloworld"
class="org.springframework.aop.framework.ProxyFactoryBean" >(実際には1行)
<property name="proxyInterfaces"><value>
IHelloWorldBean</value></property>(実際には1行)
<property name="target"><ref local=
"helloWorldBeanImpl"/></property>(実際には1行)
<property name="interceptorNames">
<value>regexpAdvisor</value>
</property>
</bean>
<bean id="regexpAdvisor"
class="org.springframework.aop.support.
RegexpMethodPointcutAdvisor">(実際には1行)
<property name="advice">
<ref local="myMethodInterceper"/>
</property>
<property name="patterns">
<list>
<value>.*.world*</value>
</list>
</property>
</bean>
<bean id="myMethodInterceper" class="MyMethodIntercepter"/>
</beans>
リスト5 サンプルコードの起動クラス
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.
ClassPathXmlApplicationContext;(実際には1行)
public class SpringTest {
public static void main(String args[]){
BeanFactory contxt =
(BeanFactory)new ClassPathXmlApplicationContext("applicationContext.xml");
IHelloWorldBean hello = (IHelloWorldBean)
contxt.getBean("helloworld");(実際には1行)
hello.helloworld();
}
}
Copyright © ITmedia, Inc. All Rights Reserved.