Maison > Java > javaDidacticiel > le corps du texte

Pourquoi les beans @Autowired sont-ils nuls dans les constructeurs ?

DDD
Libérer: 2024-11-20 04:17:01
original
277 Les gens l'ont consulté

Why Are @Autowired Beans Null in Constructors?

Comprendre les beans @Autowired nuls dans les constructeurs

Dans les applications Spring basées sur Java, les dépendances @Autowired sont généralement injectées après l'instanciation du bean. Cela signifie que si vous référencez un bean @Autowired dans un constructeur, il sera nul.

Dans l'extrait de code fourni, vous essayez d'utiliser le bean @Autowired applicationProperties dans le constructeur DocumentManager, mais il renvoie initialement null . Il s'agit d'un comportement attendu car les beans @Autowired ne sont pas encore disponibles pendant la construction.

Pour contourner ce problème, envisagez de déplacer toute logique d'initialisation qui dépend des beans @Autowired vers une méthode de post-construction distincte annotée avec @PostConstruct. La méthode @PostConstruct est exécutée après l'instanciation du bean et avant que le bean soit prêt à être utilisé.

Dans le code corrigé ci-dessous, la méthode startOOServer() a été déplacée vers une méthode @PostConstruct :

@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;


  // Constructors may not access @Autowired beans, so move this logic to a @PostConstruct method

  public DocumentManager() {
  }

  @PostConstruct
  public 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();
    ...
}
Copier après la connexion

En utilisant la méthode @PostConstruct, le code d'initialisation peut désormais s'appuyer en toute sécurité sur la disponibilité des dépendances @Autowired.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal