下面显示的是一段代码,我尝试引用我的ApplicationProperties bean。当我从构造函数引用它时它是null,但是当从另一个方法引用它时它很好。到目前为止,我在其他类中使用这个自动装配的bean没有任何问题。但这是我第一次尝试在另一个类的构造函数中使用它。
在下面的代码片段中,当从构造函数调用时,applicationProperties为null,但是当在convert方法中引用时,它不是。我缺少什么
@Component
public class DocumentManager implements IDocumentManager {
private Log logger = LogFactory.getLog(this.getClass());
private OfficeManager officeManager = null;
private ConverterService converterService = null;
@Autowired
private IApplicationProperties applicationProperties;
// If I try and use the Autowired applicationProperties bean in the constructor
// it is null ?
public DocumentManager() {
startOOServer();
}
private void startOOServer() {
if (applicationProperties != null) {
if (applicationProperties.getStartOOServer()) {
try {
if (this.officeManager == null) {
this.officeManager = new DefaultOfficeManagerConfiguration()
.buildOfficeManager();
this.officeManager.start();
this.converterService = new ConverterService(this.officeManager);
}
} catch (Throwable e){
logger.error(e);
}
}
}
}
public byte[] convert(byte[] inputData, String sourceExtension, String targetExtension) {
byte[] result = null;
startOOServer();
...
以下是ApplicationProperties的摘录...
@Component
public class ApplicationProperties implements IApplicationProperties {
/* Use the appProperties bean defined in WEB-INF/applicationContext.xml
* which in turn uses resources/server.properties
*/
@Resource(name="appProperties")
private Properties appProperties;
public Boolean getStartOOServer() {
String val = appProperties.getProperty("startOOServer", "false");
if( val == null ) return false;
val = val.trim();
return val.equalsIgnoreCase("true") || val.equalsIgnoreCase("on") || val.equalsIgnoreCase("yes");
}
答案 0 :(得分:163)
Autowiring(来自Dunes评论的链接)在构造对象后发生。因此,在构造函数完成之后才会设置它们。
如果需要运行一些初始化代码,您应该能够将构造函数中的代码拉入方法,并使用@PostConstruct
注释该方法。
答案 1 :(得分:42)
要在构造时注入依赖项,您需要将构造函数标记为@Autowired
annoation,如此。
@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
this.applicationProperties = applicationProperties;
startOOServer();
}
答案 2 :(得分:0)
是的,两个答案都是正确的。
说实话,这个问题实际上类似于帖子Why is my Spring @Autowired field null?。
错误的根本原因可以在Spring参考文档(Autowired)中进行解释,如下:
自动连接字段
在构造bean之后立即注入字段,然后再注入任何字段 config方法被调用。
但是在Spring文档中此语句背后的真正原因是Spring中的 Bean的生命周期。这是Spring设计理念的一部分。
这是Spring Bean Lifecycle Overview: Bean需要先初始化,然后才能注入诸如field之类的属性。这就是bean的设计方式,这就是真正的原因。
我希望这个答案对您有帮助!