Maison > Java > javaDidacticiel > Pourquoi les beans @Autowired sont-ils nuls dans les constructeurs ?

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

DDD
Libérer: 2024-11-20 04:17:01
original
374 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!

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