連載
» 2005年12月03日 00時00分 公開

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.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。