AOP SAMPLE

■Sample
□composition
/autoproxy
|-/bin
|-/src
| |-/samplepackage
| | |- HelloOne.java
| | |- HelloTwo.java
| | |- HelloThree.java
| | |- HelloAdvice.java
| | |- Practitioner.java
|-/conf ・・・ 設定ファイル格納フォルダ
| |- applicationContext.xml
| |- log4j.xml
|-/lib ・・・ ライブラリ(外部JAR)フォルダ
| |- asm-attrs.jar
| |- cglib-2.1.3.jar
| |- commons-logging-1.0.4.jar
| |- log4j-1.2.11.jar
| |- spring-aop.jar
| |- spring-beans.jar
| |- spring-context.jar
| |- spring-core.jar

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step01
AOPをかける対象クラスを作成する。
対象クラス
・HelloOne.java
・HelloTwo.java
・HelloThree.java

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloOneクラス.
*/
public class HelloOne {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloOne.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloTwoクラス.
*/
public class HelloTwo {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloTwo.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloThreeクラス.
*/
public class HelloThree {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloThree.class);
  /** メッセージ */
  private String message;

  /**
   * @return message を戻す。
   */
  public String getMessage() {
    return message;
  }

  /**
   * @param message message を設定する。
   */
  public void setMessage(String message) {
    this.message = message;
  }

  /**
   * messageを出力する.
   */
  public void message() {
    logger.info(this.message);
  }
}

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step02
AOPに使用するアドバイスクラスを作成する。
・HelloAdvice.java
AOPをメソッドの前後にかけるAroundAdviceを使用する場合、アドバイスクラスはMethodInteceptorを実装して作成する。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
* HelloAdviceクラス.
*/
public class HelloAdvice implements MethodInterceptor {

  /** ロギング */
  private Log logger = LogFactory.getLog(HelloAdvice.class);

  /* (非 Javadoc)
   * @see org.aopalliance.intercept.MethodInterceptor#invoke(org.aopalliance.intercept.MethodInvocation)
   */
  public Object invoke(MethodInvocation invocation) throws Throwable {
//    joinpointの前処理
    logger.info("前処理");
//    管理するクラスのメソッドを呼び出す
    Object result = invocation.proceed();
//    joinpointの後処理
    logger.info("後処理");

    return result;
  }
}

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step03
定義ファイルに定義する。
・applicationContext.xml

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
<'?xml version="1.0" encoding="UTF-8"?>
<'!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<'beans>
  <'!--AutoProxyBean
    <'bean
    id="defaultAdvisorAutoProxy"
    class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">
    <'property name="proxyTargetClass">
    <'value>true<'/value>
    <'/property>
    <'/bean>
  -->
  <'!-- AutoProxyBean -->
  <'!-- ※interceptorNames、beanNames属性に、ref指定は不可。(Beanでなく、Bean名を渡す。) -->
  <'bean id="beanNameAutoProxy"
    class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
    <'property name="beanNames">
      <'value>*e<'/value>
    <'/property>
    <'property name="interceptorNames">
      <'value>helloAdvisor<'/value>
    <'/property>
  <'/bean>

  <'!-- "AOPするアドバイスクラス"を"AOP対象クラス"に合体させるアドバイザークラス -->
  <'!-- どのクラスに、どうゆうルールで、どのアドバイスを合体させるか等の情報を保持している。 -->
  <'bean id="helloAdvisor"
    class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
    <'property name="advice">
      <'ref local="helloAdvice" />
    <'/property>
    <'property name="mappedName">
      <'value>*message<'/value>
    <'/property>
  <'/bean>

  <'!-- AOPするアドバイスクラス -->
  <'bean id="helloAdvice"
    class="samplepackage.HelloAdvice" />

  <'!-- AOP対象クラス -->
  <'bean id="helloOne"
    class="samplepackage.HelloOne">
    <'property name="message">
      <'value>Hello,AOP!! one<'/value>
    <'/property>
  <'/bean>

  <'bean id="helloTwo"
    class="samplepackage.HelloTwo">
    <'property name="message">
      <'value>Hello,AOP!! two<'/value>
    <'/property>
  <'/bean>

  <'bean id="helloThree"
    class="samplepackage.HelloThree">
    <'property name="message">
      <'value>Hello,AOP!! three<'/value>
    <'/property>
  <'/bean>
<'/beans>

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step04
実践クラスを作成する。要はメインクラス。
・Practitioner.java

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
package samplepackage;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Practitionerクラス.
*
*/
public class Practitioner {
  public static void main(String args[]) {
    try {
      ApplicationContext context = new ClassPathXmlApplicationContext(
      "applicationContext.xml");
      HelloOne helloOne = (HelloOne) context.getBean("helloOne");
      HelloTwo helloTwo = (HelloTwo) context.getBean("helloTwo");
      HelloThree helloThree = (HelloThree) context.getBean("helloThree");

      helloOne.message();
      helloTwo.message();
      helloThree.message();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->
□Step5
結果を確認する。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
core.CollectionFactory:66 - JDK 1.4+ collections available
xml.XmlBeanDefinitionReader:163 - Loading XML bean definitions from class path resource [applicationContext.xml]
support.AbstractRefreshableApplicationContext:92 - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext;has hCode=9142687]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [beanNameAutoProxy,helloAdvisor,helloAdvice,helloOne,helloT wo,helloThree]; root of BeanFactory hierarchy
support.AbstractApplicationContext:290 - 6 beans defined in application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=91 42687]
framework.DefaultAopProxyFactory:59 - CGLIB2 available: proxyTargetClass feature enabled
support.AbstractApplicationContext$BeanPostProcessorChecker:738 - Bean 'beanNameAutoProxy' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
support.AbstractApplicationContext:432 - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.Delegatin gMessageSource@a4e2e3]
support.AbstractApplicationContext:454 - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframewo rk.context.event.SimpleApplicationEventMulticaster@fd68b1]
support.DefaultListableBeanFactory:268 - Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [beanNameAutoProxy,helloAdvisor,helloAdvice,helloOne,helloTwo,helloThree]; root of BeanFactory hierarchy]
autoproxy.HelloAdvice:26 - 前処理
autoproxy.HelloOne:39 - Hello,AOP!! one
autoproxy.HelloAdvice:30 - 後処理
autoproxy.HelloTwo:39 - Hello,AOP!! two
autoproxy.HelloAdvice:26 - 前処理
autoproxy.HelloThree:39 - Hello,AOP!! three
autoproxy.HelloAdvice:30 - 後処理

<'!-- ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ -->


ref:
Spring/AOP 利用例/Auto Proxy
http://www.system-trust.com/pukiwiki/?Spring%2FAOP%20%CD%F8%CD%D1%CE%E3%2FAuto%20Proxy

tag : autoproxy BeanNameAutoProxyCreator AOP springframework

2008-04-11 00:48 : __fw__spring : コメント : 0 : トラックバック : 0 :
コメントの投稿
非公開コメント

« next  ホーム  prev »

search

ad



counter


tag cloud

category cloud