1

Spring 構成を既存のユーティリティ クラスに追加しようとしています。うまくいかないようで、その理由もわかりません (これらの Spring オプションを初めて使用したので、正しく実行できているかどうかさえわかりません)。

問題のクラス

@Configurable(autowire=Autowire.BY_NAME, preConstruction=true)
public class DataUtility
{
    private static final DataUtility INSTANCE = new DataUtility();

    @Autowired(required=true) //This is the new field and annotation
    private Map<String,String> dataFileMapping = new HashMap<String, String>();

    public static DataUtility getInstance()
    {
         return INSTANCE;
    }

    private DataUtility()
    {
         //Do a bunch of setup work here
         for (String s : dataFileMapping)
         {
              addDataToCache(dataFileMapping(s))
         }
    }

春の設定は次のようになります。

<context:annotation-config/>
<context:spring-configured/>
<bean id="util" class="com.myCompany.DataUtility">
    <property name="dataFileMapping">
        <map>
            <entry key="data1" value="data/file1.dat"/>
            <entry key="data2" value="data/file2.dat"/>
            <entry key="data3" value="data/file3.dat"/>
        </map>
    </property>
</bean>

問題は、デバッガーでコードをステップ実行すると、コードdataFileMappingが空であることを確認できることです。春の設定が実行されているかどうかさえわかりません。

4

2 に答える 2

0

問題の根本は、静的参照 INSTANCE を使用してオブジェクトにアクセスしているように見えることです。Spring は「util」という名前の Bean を作成し、それをデータでセットアップしますが、それは INSTANCE が指すオブジェクトにはなりません。静的フィールドの初期化は、Spring が Bean を作成して注入する機会を得るずっと前に、クラスが最初にロードされたときに行われます。

このように偽装することもできますが、もちろん、Bean の初期化前にインスタンスにアクセスしようとすると失敗します。

@Configurable(autowire=Autowire.BY_NAME, preConstruction=true)
public class DataUtility
{
    private static final DataUtility INSTANCE = null;

    @Autowired(required=true) //This is the new field and annotation
    private Map<String,String> dataFileMapping = new HashMap<String, String>();

    public static DataUtility getInstance()
    {
         return INSTANCE;
    }

    public postInit()
    {
         INSTANCE = this;
         //Do a bunch of setup work here
         for (String s : dataFileMapping)
         {
              addDataToCache(dataFileMapping(s))
         }
    }


    <bean id="util" class="com.myCompany.DataUtility" init-method="postInit">
        <property name="dataFileMapping">
            <map>
                <entry key="data1" value="data/file1.dat"/>
                <entry key="data2" value="data/file2.dat"/>
                <entry key="data3" value="data/file3.dat"/>
            </map>
        </property>
    </bean>
于 2012-11-29T20:50:00.857 に答える
0

dataFileMapping のゲッターとセッターを追加するだけでよいと思います

また、コンストラクターでマップを反復処理できないことに注意してください。コンストラクターが実行されるまで、Spring はマップを設定する機会がありませんでした。

これに加えて、コンストラクターをプライベートにすることはできず、Spring がそれをインスタンス化できると期待することはできません。

于 2012-11-29T20:44:17.317 に答える