Java 标记了原型范围的Bean在Spring中不工作

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

我有两颗豆子,父母和孩子。我已声明为原型作用域的子bean。
我希望新的子对象用于调用父类中任何子对象的方法。例如,在下面的示例中,我希望语句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{.....}