28

我是春天的新手。

这是bean注册的代码:

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

这是我的豆类:

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....
}

这是我执行操作的主要方法:

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
}

现在我想用参数调用这个构造函数,这些参数是在我的主要方法中动态生成的。这就是我想要动态传递的意思——而不是静态传递,就像在我的bean.config文件中声明的那样。

4

5 回答 5

31

如果我猜对了,那么正确的答案是使用getBean(String beanName, Object... args)方法,它将参数传递给 bean。我可以向您展示它是如何为基于 Java 的配置完成的,但您必须了解它是如何为基于 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");

这是你要找的吗?


更新

这个答案得到了太多的支持,没有人看我的评论。尽管它是问题的解决方案,但它被认为是 Spring反模式,你不应该使用它!使用工厂、查找方法等有几种不同的方法可以正确地做事。

请使用以下 SO 帖子作为参考:

于 2014-01-18T09:45:50.100 回答
5

请看一下构造函数注入

另外,请查看IntializingBeanBeanPostProcessor以了解 springbean 的其他生命周期拦截。

于 2013-06-08T07:17:47.807 回答
2

我认为上面提出的使用构造函数注入/设置器注入的答案对于您正在寻找的用例来说并不完美。Spring 或多或少为构造函数/设置器采用静态参数值。我没有看到动态传递值以从 Spring Container 获取 Bean 的方法。但是,如果您想动态获取 User_Imple 的实例,我建议使用工厂类 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);
        }
    }

于 2014-03-06T03:47:23.243 回答
1

构造函数注入可以帮助你。在这种情况下,您可能需要生成一个带有 ID 和用户作为其属性的 POJO,并将 POJO 传递给构造函数。在配置文件中的构造函数注入中,您可以使用 pojo 作为参考来引用此构造函数。因此,您将处理 ID 和 User 中数据的动态值。

希望这可以帮助 !!

于 2013-06-10T04:42:28.017 回答
0

也许让User_Imple一个普通的 Pojo(而不是 Spring bean)可以解决你的问题?

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

爪哇:

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);
}
于 2013-06-08T07:19:23.687 回答