4

編集:これは、受け入れられた回答が私にとってうまくいく理由と、他の人にとって何が問題になる可能性があるかについての説明です。

私のfoo-app-servlet.xmlには、次の行があります:

<context:component-scan base-package="com.foo.app" />

以前 spring2 を使用していたとき、すべてのサービス Bean は applicationContext.xml から取得されていましたが、現在は foo-app-servlet.xml に直接取り込まれています。私のプロジェクトでは、サーブレットに独自のオーバーライド セットがあるため、applicationContext オーバーライド ファイルではなく、サーブレット オーバーライド ファイルでオーバーライドする必要があります。

オーバーライドするとき、コンポーネントに名前を付けていない場合、実際には小文字バージョンが使用されるため、OrderService.foo をオーバーライドするには、次のようにします。

orderService.foo=bar

編集を終了

私はSpring 2.5からSpring 3にアップグレードされたプロジェクトに取り組んでいるため、xmlと注釈ベースの構成の両方があります。以前、PropertyOverrideConfigurer を使用してさまざまな環境のプロパティを変更し、大きな成功を収めました。現在、authorize.net を使用するコードに取り組んでおり、開発環境からそれらに何も送信しないようにする必要があります。

これを達成するために、「testMode」プロパティを PropertyOverrideConfigurer でオーバーライドしたいと考えています。これは、xml を介して構成された Bean ではうまく機能しますが、注釈が構成されたクラスでそれを行う方法がわかりません。

これは、applicationContext.xml からの私のオーバーライド スニペットです。

<bean class="org.springframework.beans.factory.config.PropertyOverrideConfigurer">
    <property name="location" value="file:${user.home}/override.properties" />
    <property name="localOverride" value="true" />
    <property name="ignoreResourceNotFound" value="true" />
</bean>

オーバーライドしたいプロパティを持つクラスは次のとおりです。

@Component
public class OrderService {
    private static Log logger = LogFactory.getLog(OrderService.class);

    @Autowired @Qualifier("OrderDAO") private OrderDAO orderDao;

    @Autowired private SiteManager siteManager;
    String authorizenetProperties = "classpath:authorizenet.properties";

    private Boolean testMode = false;

    public Boolean getTestMode() {
        return testMode;
    }

    public void setTestMode(Boolean testMode) {
        this.testMode = testMode;
    }

}

うまくいかなかったいくつかのことを試しました:

com.foo.services.OrderService.testMode=true
OrderService.testMode=true

やりたいことはここでできる?spring 3 には、これを行うための新しい推奨方法がありますか?

4

2 に答える 2

5

PropertyOverrideConfigurer、プロパティ ファイル内のキーを Bean name.bean プロパティとして使用します。構成を自動スキャンする@Componentと、Spring は Bean に小文字で始まる非修飾クラス名として名前を付けます。あなたの場合、OrderServiceBean の名前はorderService. したがって、次のように動作するはずです。

orderService.testMode=true

@Component("OrderService")またはのような名前を Component アノテーションに渡すことで、Bean に名前を付けることもできます@Component("com.foo.services.OrderService")。これは Spring 3.x の新機能ではありません。

お役に立てれば

于 2012-04-24T19:02:42.507 に答える
0

この最適でないソリューションを投稿する:

別の Bean でこれを回避できます。

applicationContext.xml:

    <bean id="SiteProperties" class="com.foo.utilities.SiteProperties">
        <property name="serviceUrl" value="http://localhost:8080" />
        <property name="authorizationTestMode" value="false" />
    </bean>

OrderService.java:

@Component
public class OrderService {
    private static Log logger = LogFactory.getLog(OrderService.class);

    @Autowired @Qualifier("OrderDAO") private OrderDAO orderDao;

    @Autowired private SiteManager siteManager;
    @Autowired private SiteProperties siteProperties;
    String authorizenetProperties = "classpath:authorizenet.properties";
}

したがって、xml 構成の Bean を作成し、注釈構成の Bean に注入するだけです。

誰かが知っていれば、これを行う「正しい」方法を知りたいです。

ありがとう!

于 2012-04-05T19:50:22.597 に答える