How to pass parameters dynamically to Spring beans

后端 未结 5 2128
盖世英雄少女心
盖世英雄少女心 2020-12-28 14:31

I am new to Spring.

This is the code for bean registration:

 


        
相关标签:
5条回答
  • 2020-12-28 15:03

    Perhaps letting the User_Imple be an ordinary Pojo (instead of a Spring bean) will solve your problem?

    <!-- 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 讨论(0)
  • 2020-12-28 15:11

    I think the answers proposed above to use constructor injection/setter injection doesn't work perfectly for the use case you are looking for. Spring more or less takes static argument values for constructors/setters. I don't see a way to dynamically pass values to get a Bean from Spring Container. However, if you want to get instances of User_Imple dynamically, I would recommend using a factory class 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);
            }
        }
    
    
    0 讨论(0)
  • 2020-12-28 15:14

    If i get you right, then the correct answer is to use #getBean(String beanName, Object... args) which will pass arguments to bean. I can show you, how it is done for java-based configuration, but you'll have to find how it is done for xml based configuration.

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

    Is this what are you looking for?

    Upd. This answer gets too much upvotes and nobody looks at my comment. Even though it's a solution to problem, it is considered as spring anti-pattern and you shouldn't use it! There are several different ways to do things right using factory, lookup-method, etc..

    Please use the following SO post as a point of reference: create beans at runtime

    0 讨论(0)
  • 2020-12-28 15:19

    Constructor injection can help you. In this case you may need to generate a POJO with ID and user as its attributes and pass POJO to constructor. In constructor injection in config file you can refer this constructor with pojo as reference. So you will be handle the dynamic value of data in ID and User.

    Hope this helps !!

    0 讨论(0)
  • 2020-12-28 15:27

    Please have a look at Constructor injection.

    Also, Have a look at IntializingBean and BeanPostProcessor for other life cycle interception of a springbean.

    0 讨论(0)
提交回复
热议问题