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 添加 getter 和 setter

另外,请记住,您不能在构造函数中遍历映射,在构造函数执行之前,spring 没有机会设置它。

除此之外,您不能将构造函数设为私有并期望 spring 能够实例化它。

于 2012-11-29T20:44:17.317 回答