ホームページ  >  記事  >  Java  >  Java の Spring フレームワークでの AOP 実装を説明する例

Java の Spring フレームワークでの AOP 実装を説明する例

高洛峰
高洛峰オリジナル
2017-01-23 10:41:461309ブラウズ

はじめに
アスペクト指向プログラミング (AOP) は、このようにして、オブジェクト指向プログラミング (OOP) の欠点を補う、プログラム構造を考えるための別の視点を提供します。 クラスに加えて、AOP はアスペクトを提供します。アスペクトは、複数のタイプやオブジェクトにわたるトランザクション管理などの懸念事項をモジュール化します。 (これらの懸念事項は、横断的な懸念事項と呼ばれることがよくあります。) Spring の重要なコンポーネントは AOP フレームワークです。 それにもかかわらず、Spring IoC コンテナは AOP に依存しません。つまり、AOP を使用するかどうかを自由に選択できます。これにより、Spring IoC コンテナはより完成度の高いものになります。

Spring 2.0 AOP:

Spring 2.0 では、アスペクトをカスタマイズするためのよりシンプルかつ強力な方法が導入されており、ユーザーはスキーマベースのアプローチを使用するか、@AspectJ アノテーションを使用するかを選択できます。 新しいアプリケーションの場合、Java 5 を使用して開発されている場合は @AspectJ スタイルを使用することをお勧めします。それ以外の場合はパターンベースのスタイルを使用できます。 どちらのスタイルもアドバイス タイプと AspectJ のポイントカット言語を完全にサポートしていますが、ウィービングには引き続き Spring AOP を使用します。

この章では主に、パターンベースおよび @AspectJ ベースの AOP に対する Spring 2.0 のサポートについて説明します。 Spring 2.0 は Spring 1.2 との下位互換性を完全に保持します。次の章では、Spring 1.2 API によって提供される基礎的な AOP サポートについて説明します。 Spring で使用される

AOP:

特に EJB 宣言型サービスを置き換えるために、宣言型エンタープライズ サービスを提供します。 最も重要なサービスは宣言型トランザクション管理であり、Spring のトランザクション抽象化に基づいて構築されています。

ユーザーがカスタマイズされた側面を実装し、AOP を使用して OOP の使用を改善できるようにします。

私たちは以下のタイプをよく使います

1. プロキシベースの AOP
2. 純粋でシンプルな Java オブジェクトのアスペクト
3. Aspcet アスペクトの注入形式があります
それを適用してみましょう
最初にいくつかの基本的なクラスを作成しましょう。
インターフェースクラス:

/** 
 * 定义一个接口 
 */
public interface Sleepable { 
  
  /** 
   * 睡觉方法 
   */
  void sleep(); 
}

実装クラス:

/**
 * 本人实现睡觉接口
 */
public class ChenLliNa implements Sleepable {
  
  @Override
  public void sleep() {
    // TODO Auto-generated method stub
    System.out.println("乖,该睡觉了!");
  }
}

拡張クラス:

/**
 * 定义一个睡眠的增强 同时实现前置 和后置
 */
public class SleepHelper implements MethodBeforeAdvice, AfterReturningAdvice {
  
  @Override
  public void afterReturning(Object returnValue, Method method,
      Object[] args, Object target) throws Throwable {
     System.out.println("睡觉前要敷面膜");
  }
  
  @Override
  public void before(Method method, Object[] args, Object target)
      throws Throwable {
    System.out.println("睡觉后要做美梦");
  }
  
}

1. プロキシベースの AOP

<!-- 创建一个增强 advice -->
  <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
  
  <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  <!-- 定义切点  匹配所有的sleep方法-->
  <bean id ="sleepPointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut">
      <property name="pattern" value=".*sleep"></property>
  </bean>
    
  <!-- 切面  增强+切点结合 -->
  <bean id="sleepHelperAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
     <property name="advice" ref="sleepHelper"/>
     <property name="pointcut" ref="sleepPointcut"/>
  </bean>
    
  <!-- 定义代理对象 -->
  <bean id="linaProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target" ref="lina"/>
      <property name="interceptorNames" value="sleepHelperAdvisor"/>
      <!-- <property name="proxyInterfaces" value="com.tgb.springaop.service.Sleepable"/> -->
  </bean>

たとえば、構成ファイル内:

pattern 属性は、一致する正規表現を指定します。 all sleep メソッド

org.springframework.aop.support.DefaultPointcutAdvisor を使用する目的は、ポイントカットと拡張機能を組み合わせて完全なアスペクトを形成することです

最終構成後、org.springframework.aop.framework.ProxyFactoryBean を通じて最終プロキシ オブジェクトが生成されます。

2 番目の純粋でシンプルな Java オブジェクトの側面
私の意見では、最初の構成と比較して、プロキシを使用する必要はありませんが、Spring の内部メカニズムを通じて自動的にスキャンされます。今回は、設定ファイルを次のように変更する必要があります:

<!-- 创建一个增强 advice -->
<bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper"/>
<!-- 目标类 -->
<bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  
<!-- 配置切点和通知-->
<bean id ="sleepAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
   <property name="advice" ref="sleepHelper"></property>
   <property name="pattern" value=".*sleep"/>
</bean>
  
<!-- 自动代理配置 -->
<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

最初の設定よりもはるかに簡単ですか? プロキシを設定する必要はありません。

3. @Aspect アノテーション フォーム

私たちの経験によれば、アノテーション フォームは設定ファイルよりも単純であることもわかっています。現時点では、既存のメソッドまたはクラスにアノテーションを付ける必要があります。書きます:

/**
 * 通过注解的方式 添加增强
 */
@Aspect
@Component
public class SleepHelper03 {  
    
  /*@Pointcut("execution(* com.tgb.springaop.service.impl..*(..))")*/
  @Pointcut("execution(* *.sleep(..))")
  public void sleeppoint(){}
    
  @Before("sleeppoint()")
  public void beforeSleep(){
    System.out.println("睡觉前要敷面膜");
  }
    
  @AfterReturning("sleeppoint()")
  public void afterSleep(){
    System.out.println("睡觉后要做美梦");
  }

4. Aspcet セクションの注入形式
個人的には、これが最も単純で、最も一般的に使用され、最も柔軟だと感じます。設定ファイルは次のとおりです:

<!--扫描包 -->
   <context:component-scan base-package="com.tgb" annotation-config="true"/> 
   <!-- ASPECTJ注解 -->
   <aop:aspectj-autoproxy proxy-target-class="true" /> 
     
   <!-- 目标类 -->
   <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>

設定ファイルに記載されている SleepHelper02 クラスは次のとおりです:

<!-- 目标类 -->
  <bean id="lina" class="com.tgb.springaop.service.impl.ChenLliNa"/>
  <bean id ="sleepHelper" class="com.tgb.springaop.aspect.SleepHelper02"/>
    
  <aop:config>
    <aop:aspect ref="sleepHelper">
       <aop:before method="beforeSleep" pointcut="execution(* *.sleep(..))"/>
       <aop:after method="afterSleep" pointcut="execution(* *.sleep(..))"/>
    </aop:aspect>
  </aop:config>



とても単純そうに見えませんか? !

呼び出し方法に関しては、ここにいくつかのテスト クラスが書かれています。見てみてください。それらは基本的に同じです:

/**
 * 通过注解的方式 添加增强
 */
  
public class SleepHelper02 {
  public void beforeSleep(){
    System.out.println("睡觉前要敷面膜");
  }
  public void afterSleep(){
    System.out.println("睡觉后要做美梦");
  }
}



どのメソッドが使用されても、テスト クラスからわかります。これらのテスト クラスの結果は同じです:


Java の Spring フレームワークでの AOP 実装を説明するその他の例については、PHP 中国語 Web サイトの関連記事に注目してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。