3

したがって、Spring xml 構成では、次のポイントカットを定義します。

<aop:config>
    <aop:aspect ref="metricsAdviceInterceptor">
        <aop:around method="invoke" pointcut="@annotation(com.mycom.MetricsAdvice)"/>
    </aop:aspect>
</aop:config>

アイデアは、「MetricsAdvice」アノテーションを持つメソッドでメトリックを収集することです。

class SomeClass {
    @MetricsAdvice
    public void someMethod(...) { ... }
}

したがって、Spring 構成で明示的に Bean を宣言すると、これはすべて正常に機能します。

 <bean id="someBean" class="com.mycom.SomeClass" />

しかし、ジャージコードでこの注釈を使用できるようにしたいのですが、機能しません。ここで、ジャージ構成で、以下を web.xml に追加します。アイデアは、さまざまな休憩サービスを見つけるパッケージを jersey に伝えているということです。つまり、パッケージ内のクラスを探します: com.mycom.restservices.* そしてそれらをインスタンス化します。おそらく、これらの Bean のインスタンス化は「別の方法で」行われているため、プロキシされていません。

<servlet>
    <servlet-name>JerseyWebApplication</servlet-name>
    <servlet-class>com.sun.jersey.spi.spring.container.servlet.SpringServlet</servlet-class>
    <display-name>Jersey Servlet</display-name>
    <init-param>
        <param-name>com.sun.jersey.config.property.resourceConfigClass</param-name>
        <param-value>com.sun.jersey.api.core.PackagesResourceConfig</param-value>
    </init-param>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>
            com.mycom.restservices.billing;
            com.mycom.restservices.account;
            org.codehaus.jackson.jaxrs
        </param-value>
    </init-param>
    ....

では、ジャージー ビーンでこれらのアノテーションを機能させるための「ベスト プラクティス」とは何でしょうか。

どうも。

4

1 に答える 1

0

明示的な Bean 宣言を取り除くことだけが必要な場合は、Jersey の代わりに Spring クラスパス スキャン機能を使用できます。

Jersey リソースに@Componentアノテーション (または他の同様のアノテーション) を付け<context:component-scan>、これらのリソースでパッケージを指定するために使用します。

このようにして、Bean は Spring によってインスタンス化され、Spring AOP は正常に機能します。

以下も参照してください。

于 2012-07-05T17:06:22.763 に答える