我有两个豆子,父母和孩子。我已经宣布了原始范围的童豆。
我想新的子对象用于调用Parent类中的任何子方法。例如。在下面的示例中,我希望语句1调用方法 sayHi 在不同的子对象上,语句2调用 sayHi1 在不同的子对象上。
一种方法是在调用任何子方法之前,使用context.getBean("")
实现 ApplicationContextAware 并获取新的子对象。但我不想这样做。
还有其他选择吗?
@Component
public class Parent{
@Autowired
Child child;
public void sayHello(){
child.sayHi(); -------------- (1)
}
public void sayHello1(){
child.sayHi1(); --------------- (2)
}
}
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE)
public class Child{
public void sayHi(){
System.out.println("Hi Spring 3.0");
}
public void sayHi1(){
System.out.println("Hi1 Spring 3.0 ");
}
}
答案 0 :(得分:10)
修复只是将原型bean标记为作用域代理,这意味着当您将较小范围的bean注入较大范围时(例如在将原型注入单例的情况下)然后将bean的代理注入到更大的范围中,当通过代理调用bean的方法时,代理会理解范围并做出适当的响应。
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Child{
另一种选择可能是使用名为here
的查找方法注入答案 1 :(得分:2)
我认为你每次都必须自己制作一个new Child
,或者确实使用弹簧上下文来获得一个新鲜的豆。
Spring只会在需要注入某些内容时创建一个新实例(如果是原型)。当你在课堂上时,你实际上超出了春天的范围。
以下是类似帖子:@Scope("prototype") bean scope not creating new bean
http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype第4.4.2和4.4.3部分是相关的。
答案 2 :(得分:1)
原型范围意味着Spring每次请求时都会给你一个新的Child
对象(通过注入或从应用程序上下文中显式查找bean)。在Parent
课程中,您只需要Child
一次,所以您只能获得一次Child
。如果您想在Parent
中使用两个不同的@Component
public class Parent{
@Autowired
Child child;
@Autowired
Child child1;
public void sayHello(){
child.sayHi();
}
public void sayHello1(){
child1.sayHi1();
}
}
个对象,请自动连接两个:
{{1}}
答案 3 :(得分:0)
你不能这样做。 ApplicationContext启动后,只会向child注入一个bean。 对于每个父母,将创建一个新的孩子。
事物是父母只有一个孩子,所以你的2个方法只会调用那个子方法。
你究竟想要实现什么目标? 我相信它有适当的解决方案。
答案 4 :(得分:0)
为了将组件转换为原型,我们这样做 - 您可能已经知道这一点 :)
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE)
Class B{ .....}
只有当 B 类被称为 .getBean(B.class)
OR 类自动装配它也是一个原型时,这才会有帮助。
现在,假设我们这样做
@Component
Class A{
@Autowired
Class B;
}
A 类是单例,它假定 B 类的每个实例也是单例:|
现在,如何告诉 A 类 B 类是 Prototype?
简单,只要包含proxyMode=ScopedProxyMode.TARGET_CLASS
,A类就会知道B类是Prototype!
它看起来像下面这样:
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class B{.....}