102 votes

Quoi qu'il en soit, @Autowire un bean nécessitant des arguments de constructeur?

Je suis l'aide de Printemps 3.0.5 et je suis à l'aide de @Autowire annotation pour mes membres de la classe autant que possible. L'une des haricots que j'ai besoin de autowire requiert des arguments à son constructeur. J'ai regardé à travers le Printemps docs, mais ne semblent pas pouvoir trouver aucune référence à la façon d'annoter des arguments du constructeur.

En XML, je peux l'utiliser dans le cadre de la fève de définition. Est-il un mécanisme similaire pour @Autowire annotation?

Ex:

@Component
public class MyConstructorClass{

  String var;
  public MyConstructorClass( String constrArg ){
    this.var = var;
  }
...
}


@Service
public class MyBeanService{
  @Autowired
  MyConstructorClass myConstructorClass;

  ....
}

Dans cet exemple, comment puis-je spécifier la valeur de "constrArg" dans MyBeanService avec le @Autowire annotation? Est-il possible de faire cela?

Merci,

Eric

58voto

Sean Patrick Floyd Points 109428

Vous avez besoin de l' @Value d'annotation.

Une utilisation courante de cas est à attribuer par défaut des valeurs de champ à l'aide de "#{systemProperties.myProp}" style expressions.

public class SimpleMovieLister {

  private MovieFinder movieFinder;
  private String defaultLocale;

  @Autowired
  public void configure(MovieFinder movieFinder, 
                        @Value("#{ systemProperties['user.region'] }"} String defaultLocale) {
      this.movieFinder = movieFinder;
      this.defaultLocale = defaultLocale;
  }

  // ...
}

Voir: Expression De La Langue > Annotation De Configuration


Pour être plus clair: dans votre scénario, vous avez de fil de deux classes, MybeanService et MyConstructorClass, quelque chose comme ceci:

@Component
public class MyBeanService implements BeanService{
    @Autowired
    public MybeanService(MyConstructorClass foo){
        // do something with foo
    }
}

@Component
public class MyConstructorClass{
    public MyConstructorClass(@Value("#{some expression here}") String value){
         // do something with value
    }
}

Mise à jour: si vous avez besoin de plusieurs instances différentes d' MyConstructorClass avec des valeurs différentes, vous devez utiliser Qualifier les annotations

9voto

skaffman Points 197885

Dans cet exemple, comment puis-je spécifier la valeur de "constrArg" en MyBeanService avec l' @Autowire d'annotation? Est-il possible de faire cela?

Non, pas dans le sens que tu veux dire. La fève représentant MyConstructorClass doit être configurable sans exiger de son client, de haricots, de sorte MyBeanService n'a pas son mot à dire dans la façon dont MyConstructorClass est configuré.

Ce n'est pas un permettra à l'autowiring problème, le problème ici est de savoir comment ne Ressort instancier MyConstructorClass, étant donné qu' MyConstructorClass est @Component (et si vous utilisez le composant de balayage, et, par conséquent, ne pas spécifier MyConstructorClass explicitement dans votre config).

Comme @Sean dit, une réponse ici est d'utiliser @Value sur le paramètre de constructeur, de sorte que le Printemps va chercher le constructeur de la valeur à partir d'un système de propriété ou les propriétés de fichier. L'alternative est de MyBeanService instancier directement MyConstructorClass, mais si vous le faites, alors MyConstructorClass n'est plus un Printemps bean.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X