Printemps @Autocâblés - Instancier de nouveaux bean

Besoin de l'aide avec le Printemps, permettra à l'autowiring, et étendues.

Ici est l'application de base structure:

  1. J'ai un CustomHttpClient, avec l'annotation @Component, et également tirant quelques config liées à des propriétés de l'application.fichier de propriétés (via @Valeur de l'annotation).
  2. CustomHttpClient est utilisé par plusieurs services dans mon application. Chaque fois que je suis en utilisant le CustomHttpClient, je autowire une instance de cette via:
    @Autowired
    private CustomHttpClient httpClient;
  3. - Je utiliser de l'intercepteur à modifier certaines des variables à l'intérieur de CustomHttpClient, comme suit:
    public class MyInterceptor extends HandlerInterceptorAdapter {
    @Autowired CustomHttpClient httpClient;
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    httpClient.setSomeProperty(newValue);
    ...

Maintenant, ici, est le problème. Si j'ai tout configuré comme décrit ci-dessus, alors à chaque fois que je changer les réglages de la CustomHttpClient par interceptor, que la nouvelle valeur est conservée pour tous les autres clients, tant que la machine virtuelle est en cours d'exécution. Donc, quand je lance httpClient.setSomeProperty() - ce paramètre est maintenant définitivement sauvé. Même si je me connecte à l'application à partir d'un autre client.

Fondamentalement, ce que j'ai besoin de deux choses:

  1. Toujours être en mesure de remplacer les paramètres par défaut de la CustomHttpClient via l'intercepteur (intercepteur de demande, configuré via ).
  2. Assurez-vous qu'une nouvelle instance de CustomHttpClient est créé pour chaque requête (après l'intercepteur ne de sa magie).

J'ai tenté de changer le champ d'application de CustomHttpClient à @Scope("prototype"), mais de cette façon je ne peux plus modifier les paramètres de CustomHttpClient avec un intercepteur.

J'ai peut-être tort, mais je pense que le design est probablement erronée si vous avez besoin pour l'injection de ce prototype de composant réutilisable dont les propriétés vous avez besoin de modifier, conformément à la demande. Peut-être, c'est meilleur si vous le contrôle de la création et de la destruction manuellement. Après tout, pas tous les objets sont censés être injecté.
Hmmm, qui pourrait être un bon point. Mais si je n'ai pas autowire et injecter le composant, aurais-je encore être en mesure d'ajuster ses propriétés avec un intercepteur? Disons que je n'ai pas de contrôle sur le service qui utilise le composant, et ne peut modifier certaines propriétés via les en-têtes HTTP et/ou de la chaîne de requête params. C'est la principale raison pour laquelle je suis allé avec permettra à l'autowiring.
Si vous avez juste besoin d'ajuster les en-têtes et/ou des paramètres, pourquoi ne pas vous venez de modifier le HttpServletRequest/HttpServletResponse ? C'est pourquoi ils sont à votre disposition dans un intercepteur.
La modification de la demande serait l'idéal, mais je ne pense pas que je peux accéder à la demande de la portée de la CustomHttpClient sans permettra à l'autowiring que la première. Si j'ai mis la nouvelle en-tête de l'objet HttpServletRequest puis il est là pour ça, mais j'ai besoin de faire plus de traitement avec le Composant sous-jacent, où la CustomHttpClient vie.
Je vous ai fourni une réponse. Veuillez fournir des commentaires après l'examen. Laissez-moi savoir si cela a fonctionné pour vous.

OriginalL'auteur isyndicate | 2013-09-24