当前位置: 首页 > 知识库问答 >
问题:

@自动生成的bean在另一个bean的构造函数中引用时为空

赫连冠玉
2023-03-14

下面显示的是我尝试引用我的Application ationProperties bean的代码片段。当我从构造函数引用它时,它是null,但是当从另一个方法引用它时,它是好的。到目前为止,我在其他类中使用这个自动豆没有问题。但这是我第一次尝试在另一个类的构造函数中使用它。

在下面的代码段中,从构造函数调用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();
    ...

下面是应用程序属性的片段...

@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");
  }

共有3个答案

殷宾白
2023-03-14

是的,两个答案都是正确的。

老实说,这个问题实际上与帖子类似,为什么我的Spring@Autowired字段为空。

错误的根本原因可以在Spring参考文档中解释,如下所示:

自动连线字段

字段在构造bean之后,在调用任何配置方法之前被注入。

但Spring doc中这句话背后的真正原因是Spring中Bean的生命周期。这是Spring设计理念的一部分。

希望这个回答对你有帮助!

朱博实
2023-03-14

要在构建时注入依赖项,您需要像这样用@autowed注释标记构造函数。

@Autowired
public DocumentManager(IApplicationProperties applicationProperties) {
  this.applicationProperties = applicationProperties;
  startOOServer();
}
杨甫
2023-03-14

自动布线(链接自Dunes comment)发生在对象构造之后。因此,在构造函数完成之前不会设置它们。

如果您需要运行一些初始化代码,您应该能够将构造函数中的代码拉到一个方法中,并用@PostConstruct注释该方法。

 类似资料:
  • 问题内容: 下面显示的是我尝试引用我的ApplicationProperties bean的代码片段。当我从构造函数引用它时,它为null,但是从另一个方法引用时,它很好。到目前为止,在其他类中使用此自动装配的bean都没有问题。但这是我第一次尝试在另一个类的构造函数中使用它。 在下面的代码段中,当从构造函数调用时,applicationProperties为null,但在convert方法中引用

  • 问题内容: 我需要创建一个没有构造函数参数的不完整对象。像这样 我希望这个Bean是Spring管理的,以便以后可以使用Spring AOP。 但是我的bean需要将超时作为动态值传递-是否有一种方法可以创建在构造函数中注入了动态值的spring托管bean? 问题答案: 有一个方法,根据javadoc,它允许您指定构造函数参数,该参数用于覆盖bean定义自己的参数。因此,您可以在bean文件中放

  • 关于Spring bean配置,我有两个主要问题:1。当我从应用程序上下文检索bean时,我通过属性文件读取的属性并不持久化。2.我很难弄清楚如何将bean的值设置为另一个bean-在下面的示例中,我试图将Plan bean的度量属性设置为某个bean。 我有两个小班,一个度量,和一个更大的计划: 但是当我尝试访问这个bean时,我在主应用程序中得到了默认值或空值,这表明这些属性没有持久化:

  • 我有一个Bean,负责从配置文件加载项目设置,并使它们可用于任何其他可能需要它们的对象: 现在,我有一组组件类,它们通过多个步骤扩展了一个抽象类,我想在其中使用这个bean: 根据我的理解,这应该是有效的,因为@autowmed字段受到保护,因此可以从@Component类中看到。然而,相反,我得到了这个例外: ...其中引用的

  • 引用自C Primer 如果我们显式地要求编译器使用生成移动操作,并且编译器无法移动所有成员,那么移动操作将被定义为删除 如果类有一个定义自己的复制构造函数的成员,但不定义移动构造函数,或者如果类有一个不定义自己的复制操作的成员,并且编译器无法合成,则移动构造函数被定义为删除移动构造函数 有些代码似乎违反了这条规则: X没有定义移动构造函数,编译器不能为它合成一个。 根据上述规则,的移动构造函数被

  • 我尝试用注释,但没有没有参数的构造函数。即使我添加了一个不带参数的构造函数,也是,因此在初始化之后不能设置它。而且有一个只带参数的构造函数。 在初始化之后,我需要将其放置在内存中,并且需要能够在其他组件中自动连接它以读取/删除/添加项。我不知道怎么用Spring靴做这件事。非常感谢任何帮助。