2

サービスに側面を注入しようとしています。このサービスでは、従来の方法を使用してプロキシ オブジェクトを作成しています。

必要なすべてのアドバイスのリストを含むタイプ (ProxyFactoryBean) の bean-baseProxy を作成しました。

    <bean id="baseProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
    <property name="interceptorNames">
        <list>
            <value>methodInvocationAdvice</value>
        </list>
    </property>
</bean>

次のようなサービスのプロキシを作成しています。

<bean id="singproxy" parent="baseProxy">
    <property name="target" ref="singtarget" />
    <property name="targetClass" value="com.spring.learning.SingingService"></property>
</bean>

これは機能しませんが、これら2つのプロパティを元に戻して次のように書くと:

<bean id="singproxy" parent="baseProxy">
    <property name="targetClass" value="com.spring.learning.SingingService"></property>
    <property name="target" ref="singtarget" />
</bean>

驚いたことに、それはうまく機能します。春は豆の注文でいいの?それとも、ProxyFactoryBean の特殊なケースですか? Spring 3.0 で試してみましたが、以前のバージョンでも同じ動作が存在するかどうかはわかりません。

4

1 に答える 1

1

targetとについてtargetClassは、どちらか一方ですが、両方ではありません。の親クラスである関連ソース (org.springframework.aop.framework.AdvisedSupport から) は次のProxyFactoryBeanとおりです。

public void setTarget(Object target) {
    setTargetSource(new SingletonTargetSource(target));
}

public void setTargetSource(TargetSource targetSource) {
    this.targetSource = (targetSource != null ? targetSource : EMPTY_TARGET_SOURCE);
}


public void setTargetClass(Class targetClass) {
    this.targetSource = EmptyTargetSource.forClass(targetClass);
}

ご覧のとおり、 と の両方が同じフィールドsetTarget()setTargetClass()書き込むため、最後の代入が優先されます。

于 2011-08-08T08:49:14.387 に答える