web-dev-qa-db-fra.com

Comment passer dynamiquement des paramètres aux beans Spring

Je suis nouveau au printemps.

Voici le code d'enregistrement du bean:

<bean id="user" class="User_Imple"> </bean>
<bean id="userdeff" class="User"> </bean>

et voici ma classe de haricots:

public class User_Imple implements Master_interface {

    private int id;
    private User user; // here user is another class

    public User_Imple() {
        super();
    }

    public User_Imple(int id, User user) {
        super();
        this.id = id;
        this.user = user;
    }

    // some extra functions here....
}

et c'est ma principale méthode pour effectuer une action:

public static void main(String arg[]) {

    ApplicationContext context = new ClassPathXmlApplicationContext("/bean.xml");
    Master_interface master = (Master_interface)context.getBean("user");

    // here is my some operations..
    int id = ...
    User user = ...

    // here is where i want to get a Spring bean
    User_Imple userImpl; //want Spring-managed bean created with above params
}

Maintenant, je veux appeler ce constructeur avec des paramètres, et ces paramètres sont générés dynamiquement dans mes méthodes principales. C'est ce que je veux dire par je veux passer dynamiquement - pas statiquement, comme déclaré dans mon bean.config fichier.

19
Ramesh J

Veuillez consulter injection de constructeur .

Consultez également IntializingBean et BeanPostProcessor pour une autre interception du cycle de vie d'un Springbean.

5
Chris

Si je vous comprends bien, alors la bonne réponse est d'utiliser #getBean (String beanName, Object ... args) qui passera des arguments au bean. Je peux vous montrer comment cela se fait pour la configuration basée sur Java, mais vous devrez trouver comment cela se fait pour la configuration basée sur xml.

@Configuration
public class ApplicationConfiguration {

  @Bean
  @Scope("prototype") //As we want to create several beans with different args, right?
  String hello(String name) {
    return "Hello, " + name;
  }
}

//and later in your application

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfiguration.class);
String helloCat = (String) context.getBean("hello", "Cat");
String helloDog = (String) context.getBean("hello", "Dog");

C'est ce que tu cherches?

Upd. Cette réponse reçoit trop de votes positifs et personne ne regarde mon commentaire. Même si c'est une solution au problème, il est considéré comme un anti-motif à ressort et vous ne devriez pas l'utiliser! Il existe plusieurs façons de bien faire les choses en utilisant l’usine, la méthode de recherche, etc.

Veuillez utiliser le SO post comme point de référence: créer des beans à l'exécution

25
Vadim Kirilchuk

Je pense que les réponses proposées ci-dessus pour utiliser l'injection de constructeur/injection de setter ne fonctionnent pas parfaitement pour le cas d'utilisation que vous recherchez. Spring prend plus ou moins des valeurs d'argument statique pour les constructeurs/setters. Je ne vois pas de moyen de transmettre dynamiquement des valeurs pour obtenir un bean à partir de Spring Container. Cependant, si vous souhaitez obtenir des instances de User_Imple dynamiquement, je recommanderais d'utiliser une classe d'usine User_Imple_Factory

 
    public class User_Imple_factory {
        private static ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");

        public User_Imple createUserImple(int id) {
            User user = context.getBean("User");
            return new User_Imple(id, user);
        }
    }
1
nishant

L'injection de constructeur peut vous aider. Dans ce cas, vous devrez peut-être générer un POJO avec ID et utilisateur comme attributs et transmettre POJO au constructeur. Dans l'injection de constructeur dans le fichier de configuration, vous pouvez faire référence à ce constructeur avec pojo comme référence. Vous allez donc gérer la valeur dynamique des données dans ID et User.

J'espère que cela t'aides !!

1
Harish Kumar

Peut-être laisser le User_Imple être un Pojo ordinaire (au lieu d'un haricot de printemps) résoudra votre problème?

<!-- Only use User as a Spring Bean -->
<bean id="userdeff" class="User"></bean>

Java:

public static void main(String arg[])
{
    ApplicationContext context =new ClassPathXmlApplicationContext("/bean.xml");
    User user = context.getBean(User.class);

    int id = // dynamic id
    Master_interface master = new User_Imple(id, user);
}
0
matsev