我有两个像这样的豆子:
@Component
@Scope("prototype")
class A {
A(int number, B anotherBean) {
//...
}
}
@Component
class B {
//..
}
如何构建A并使B自动装配?如果我使用new我将不会获得anotherBean的值,如果我使用autowiring我将无法获得number的值。
编辑:该号码是在运行时计算出来的,所以我不能像建议的那样使用@Value。
答案 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搜索找到。