带有@Resource注入字段的Init数组

时间:2014-05-12 20:44:44

标签: java spring dependency-injection

我有Spring管理的应用程序,并尝试从数组访问注入的资源:

import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.Collection;

@Service("serviceA")
class A {

    @Resource
    private HeaderLevelValidator defaultHeaderLevelValidator;

    @Resource
    private HeaderLevelValidator headerLevelValidator;

    /** Validators specific for Storefront. */
    private final Collection<HeaderLevelValidator> HEADER_BEAN_NAMES = Arrays.asList(defaultHeaderLevelValidator,
            headerLevelValidator);

    public Collection<HeaderLevelValidator> getHeaderValidators()
    {
        return HEADER_BEAN_NAMES;
    }

}

我尝试使用 getHeaderValidators()在运行时访问我的列表,但获得了空值列表 {null,null} 。为什么?定义注入资源列表的正确方法是什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题是在注入bean之前正在初始化HEADER_BEAN_NAMES。在对象实例化和初始化之后发生字段注入。尝试将初始化移动到使用@PostConstruct注释的方法,或者如果要保留HEADER_BEAN_NAMES final,请改用构造函数注入。

答案 1 :(得分:0)

初始化后期建设。

private Collection<HeaderLevelValidator> HEADER_BEAN_NAMES;

@PostConstruct
public void init()
{
   HEADER_BEAN_NAMES = Arrays.asList(defaultHeaderLevelValidator,
        headerLevelValidator);
}

在Spring构造托管bean之后,将调用init()方法。请注意,HEADER_BEAN_NAMES不能是最终的,因为它在构造后初始化。