Java 标记了原型范围的Bean在Spring中不工作
我有两颗豆子,父母和孩子。我已声明为原型作用域的子bean。Java 标记了原型范围的Bean在Spring中不工作,java,spring,scope,prototype-scope,Java,Spring,Scope,Prototype Scope,我有两颗豆子,父母和孩子。我已声明为原型作用域的子bean。 我希望新的子对象用于调用父类中任何子对象的方法。例如,在下面的示例中,我希望语句1在不同的子对象上调用方法sayHi,语句2在不同的子对象上调用方法sayHi1 一种方法是实现ApplicationContextAware,并在调用任何子对象的方法之前使用context.getBean(“”)获取新的子对象。但我不想那样做 还有其他选择吗 @Component public class Parent{ @Autowired
我希望新的子对象用于调用父类中任何子对象的方法。例如,在下面的示例中,我希望语句1在不同的子对象上调用方法sayHi,语句2在不同的子对象上调用方法sayHi1 一种方法是实现ApplicationContextAware,并在调用任何子对象的方法之前使用
context.getBean(“”
)获取新的子对象。但我不想那样做
还有其他选择吗
@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 ");
}
}
我认为每次你都必须自己做一个
新的孩子
,或者使用spring上下文来获得一个新的bean
Spring只会在需要注入一些东西时(在原型的情况下)创建一个新实例。当您在一个类中时,实际上超出了spring的范围
下面是一个类似的帖子:
第4.4.2和4.4.3部分是相关的。您不能这样做。
启动ApplicationContext后,只有一个bean将被注入子对象。
将为每个父级创建一个新的子级
问题是父对象只有一个子对象,因此您的两个方法将只调用该子对象方法
你到底想达到什么目的?
我确信有一个合适的解决方案。修复方法只是将原型bean标记为作用域代理,这意味着当您将一个作用域较小的bean注入一个较大的作用域时(就像您将一个原型注入单例的情况一样)然后,bean的代理将被注入到更大的作用域中,当bean的方法通过代理调用时,代理将理解作用域并做出适当的响应
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Child{
这是一个
另一种选择是使用一种称为查找方法注入的方法,Prototype作用域表示每次您请求一个新的
子对象时,Spring都会给您一个新的子对象(通过注入或从应用程序上下文显式检索bean)。在你的家长
班上,你只要求一个孩子
一次,所以你只得到一个。如果希望在父对象中有两个不同的子对象,请自动关联两个:
@Component
public class Parent{
@Autowired
Child child;
@Autowired
Child child1;
public void sayHello(){
child.sayHi();
}
public void sayHello1(){
child1.sayHi1();
}
}
其他人已经给出了答案,我将包括一个可能有用的理论
要将组件转换为原型,我们需要这样做—您可能已经知道这一点:)
只有当类B被称为.getBean(B.class)
或类Autowiring时,这才有帮助。它也是一个原型
现在,假设我们这样做
@Component
Class A{
@Autowired
Class B;
}
类A是单例的,它假定类B的每个实例也是单例的:|
现在,如何告诉A类B类是原型
简单,只需包含proxyMode=ScopedProxyMode。目标_CLASS
和CLASS A就会知道CLASS B是原型
它将如下所示:
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class B{.....}
若它是xml配置,那个么您将使用查找方法方法,但我相信这在注释中还不可用。
@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class B{.....}