1

いくつかのメソッドがあるクラスがあり、クラスのインターフェイスは次のようになります

一部のメインプログラムはメソッドdoSomeOperationを呼び出し、メソッドdoSomeOperationはビジネスルールに基づいてクラス内の他のメソッドを呼び出します。このクラスのいくつかのメソッドが呼び出された後、いくつかの統計情報を入力する必要がある状況があります。

たとえば、doSomeOperationを呼び出した後、doOps1を呼び出します。データベースに統計テーブルを入力して、特定のテーブルに挿入/更新/削除されたレコードの数や、doOps1メソッドによる所要時間などを示します。この目的でSpringAOPを使用しようとしています。しかし、私が直面している問題は、意図したコードが呼び出されないことです。

これが完全なコードです(サンプル目的のみ)

 package spring.aop.exp;

public interface Business {
    void doSomeOperation();        
    void doOps1();
}

package spring.aop.exp;

public class BusinessImpl implements Business {

    public void doSomeOperation() {
            System.out.println("I am within doSomeOperation");
            try {
                    Thread.sleep(200);
            } catch (InterruptedException e) {
                    System.out.println("Thread interrupted");
            }
            System.out.println("Done with sleeping.");
            doOps1();
    }

    public void doOps1() {
        System.out.println("within Ops1");
    }               

}

アスペクトクラス

package spring.aop.exp;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

@Aspect
public class BusinessProfiler {

        @Pointcut("execution(* doOps1*(..))")
        public void businessMethods1() { }


        @After("businessMethods1()")
         public void profile1() throws Throwable {
            //this method is supposed to populate the db stats and other statistics

            System.out.println("populating stats");

        }

}

-メインクラス

package spring.aop.exp;

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

public class SpringAOPDemo {

        /**
         * @param args
         */
        public static void main(String[] args) {
                ApplicationContext context = new ClassPathXmlApplicationContext(
                                "ExpAOP.xml");
                Business bc = (Business) context.getBean("myBusinessClass");
                bc.doSomeOperation();                   
        }

}

*および構成ファイル***

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">

        <!-- Enable the @AspectJ support -->
        <aop:aspectj-autoproxy />

        <bean id="businessProfiler" class="spring.aop.exp.BusinessProfiler" />
        <bean id="myBusinessClass" class="spring.aop.exp.BusinessImpl" />
</beans>

メインプログラムを実行すると、出力が表示されます(Aspectクラスからprofile1を呼び出していません-BusinessProfiler)。ただし、メインクラスからdoOps1を直接呼び出すと、アスペクトメソッドが呼び出されます。mainメソッドからのみ呼び出され、それ以外の場合はアスペクトが機能しないかどうかを知りたいです。

2012年10月26日11:56:19AMorg.springframework.context.support.AbstractApplicationContext prepareRefresh情報:org.springframework.context.support.ClassPathXmlApplicationContext @ be2358を更新しています:表示名[org.springframework.context.support.ClassPathXmlApplicationContext@be2358] ; 開始日[2012年10月26日金曜日11:56:19EDT]; コンテキスト階層のルート2012年10月26日11:56:19AMorg.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions情報:クラスパスリソースからのXMLBean定義のロード[ExpAOP.xml]2012年10月26日11:56:19 AM org.springframework.context.support.AbstractApplicationContext getFreshBeanFactory情報:アプリケーションコンテキストのBeanファクトリ[org.springframework.context.support.ClassPathXmlApplicationContext@be2358]:org.springframework.beans.factory.support。DefaultListableBeanFactory @1006d752012年10月26日11:56:19AMorg.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons情報:org.springframework.beans.factory.support.DefaultListableBeanFactory@1006d75のシングルトンの事前インスタンス化:Beanの定義[org .springframework.aop.config.internalAutoProxyCreator、businessProfiler、myBusinessClass]; 工場階層のルート

*私はdoSomeOperation内に います。 Ops1内***

4

1 に答える 1

0

Spring AOPはデフォルトproxy-basedであり、その呼び出しの別のメソッド内から同じクラスのメソッドを呼び出すと、呼び出しはアスペクト プロキシを経由せず、メソッドに直接送信されます。これが、アスペクト コードが呼び出されない理由です。それをよりよく理解するには、 AOP プロキシの理解に関する Spring ドキュメントのこの章をお読みください。

于 2012-10-28T14:52:18.470 に答える