与混合的构造函数的春天autowiring豆

时间:2014-12-09 08:45:16

标签: java spring

我有两个像这样的豆子:

@Component
@Scope("prototype")
class A {
    A(int number, B anotherBean) {
         //...
    }
}

@Component
class B {
     //..
}

如何构建A并使B自动装配?如果我使用new我将不会获得anotherBean的值,如果我使用autowiring我将无法获得number的值。

编辑:该号码是在运行时计算出来的,所以我不能像建议的那样使用@Value。

3 个答案:

答案 0 :(得分:0)

利用@Value并通过属性注入数字值。您的ClassA应该看起来像

@Component
@Scope("prototype")
class A {

    @Autowired
    A(@Value("${some.property}")int number, B anotherBean) {
       //...
    }
}

编辑 (为数字发布运行时值的附加条件)

您可以从评论中BeanFactory.getBeans正确指出的 M.Deinum 方法中获取bean。

答案 1 :(得分:0)

我今天发现了这个问题,正在寻找答案。经过一番考虑,这是我想采用的解决方案。基本上,我将factory方法烘焙到bean的类中。这具有将“内部”依赖项(在此示例中为B)全部保留在“ A”类内并从调用者隐藏的优点,同时仍允许使用调用者的运行时值创建原型。而且,它不需要为工厂方法提供的另一个类文件。

public class A {

  private A (int number, B otherBean) {
  ...
  }

  @Configuration
  public static class BeanConfig {

    @Autowired
    private B otherBean;

    @Bean
    @Scope("prototype")
    public A makeA(int number) {
      return new A(number, otherBean);
    }
  }
}

然后,您可以在仅提供运行时值的同时请求原型bean实例:

applicationContext.getBean(A.class, 1);

答案 2 :(得分:-1)

您需要使用@Autowired注释所需的构造函数,以及使用Google搜索找到的其他方式。至于您使用' number'的问题,有一些方法可以使用注释来设置参数值,也很难通过Google搜索找到。