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

Java 带有@Resource注入字段的Init数组,java,spring,dependency-injection,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 defa

我有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;
    }

}
import org.springframework.stereotype.Service;
导入javax.annotation.Resource;
导入java.util.array;
导入java.util.Collection;
@服务(“服务A”)
甲级{
@资源
私有HeaderLevel验证程序DefaultHeaderLevel验证程序;
@资源
私有HeaderLevelValidator HeaderLevelValidator;
/**特定于店面的验证器*/
私有最终集合头\u BEAN\u NAMES=Arrays.asList(defaultHeaderLevelValidator,
头部水平仪);
公共集合getHeaderValidators()
{
返回头\u BEAN \u名称;
}
}
我试图在运行时使用getHeaderValidators()访问我的列表,但得到了空值列表{null,null}。为什么?定义注入资源列表的正确方法是什么


提前谢谢

问题在于,
HEADER\u BEAN\u NAMES
在注入BEAN之前被初始化。字段注入发生在对象实例化和初始化之后。尝试将初始化移动到带有注释的方法,或者如果希望保留
标题\u BEAN\u名称
final,请改用构造函数注入。

初始化后期构造

private Collection<HeaderLevelValidator> HEADER_BEAN_NAMES;

@PostConstruct
public void init()
{
   HEADER_BEAN_NAMES = Arrays.asList(defaultHeaderLevelValidator,
        headerLevelValidator);
}
private Collection HEADER\u BEAN\u name;
@施工后
公共void init()
{
HEADER\u BEAN\u NAMES=Arrays.asList(defaultHeaderLevelValidator,
头部水平仪);
}

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

谢谢,但这种方法有几个缺点:1)如果我只有几个CTOR,我需要以某种方式管理它;2) 如果我使用\@PostConstruct,我将看不到数组的清晰定义,可能会忘记在该数组中添加一些新bean。还有其他建议吗?@MichaelZ别忘了。Mark的建议是您必须使用Spring的。如果字段是
final
,则不能使用。绝对正确!不要声明它是最终的,或者不要使用@PostConstruct。
private Collection<HeaderLevelValidator> HEADER_BEAN_NAMES;

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