标有原型范围的Bean在Spring中不起作用

时间:2012-12-10 14:12:40

标签: java spring scope prototype-scope

我有两个豆子,父母和孩子。我已经宣布了原始范围的童豆。
我想新的子对象用于调用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 ");      
    }

}

5 个答案:

答案 0 :(得分:10)

修复只是将原型bean标记为作用域代理,这意味着当您将较小范围的bean注入较大范围时(例如在将原型注入单例的情况下)然后将bean的代理注入到更大的范围中,当通过代理调用bean的方法时,代理会理解范围并做出适当的响应。

@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class Child{

这是reference

另一种选择可能是使用名为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{.....}