2014-05-12 51 views
0

注入我有Spring管理的应用程序,并尝试访问注入reources从数组:初始化数组中的字段@Resource

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}。为什么?定义注入资源列表的正确方法是什么?

在此先感谢!

回答

1

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

+0

非常感谢,但这种方法有几个缺点: 1)如果我有几个ctors我需要以某种方式管理它; 2)如果我使用\ @PostConstruct,我将看不到数组的明确定义,并可能忘记在该数组中添加一些新的bean。还有其他建议吗? –

+0

@MichaelZ别忘了。马克的建议是你必须与Spring合作的建议。 –

0

初始化后期制作。

private Collection<HeaderLevelValidator> HEADER_BEAN_NAMES; 

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

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

+0

如果该字段是“final”,则不会。 –

+0

绝对正确!不要最终声明它,或者不要使用@PostConstruct。 –

+0

请编辑你的答案。 –