6

我有两个豆子,父母和孩子。我已将子 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 ");      
    }

}
4

5 回答 5

14

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

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

这是一个参考

另一种选择可能是使用此处描述的称为查找方法注入的东西

于 2012-12-10T15:52:04.847 回答
2

我认为您必须new Child每次都自己制作,或者确实使用春天的环境来获得新鲜的豆子。

Spring 只会在需要注入某些东西时(在原型的情况下)创建一个新实例。当你在课堂上时,你实际上已经超出了 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 部分是相关的。

于 2012-12-10T14:22:44.120 回答
1

原型作用域意味着Child每次你请求一个新对象时,Spring 都会给你一个新对象(通过注入或从应用程序上下文中显式检索 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();
    }
}
于 2012-12-10T16:03:39.860 回答
1

其他人已经给出了答案,我将包括一个可能有帮助的理论

要将组件转换为原型,我们这样做 -你可能已经知道了:)

@Scope(value=BeanDefinition.SCOPE_PROTOTYPE)
Class B{ .....}

这仅在 B 类被称为.getBean(B.class) 自动装配类也是原型时才有帮助。


现在,假设我们这样做

 @Component
    Class A{
   
          @Autowired
          Class B;
     }
   

A 类是单例的,它也假定 B 类的每个实例都是单例:|


现在,如何告诉 A 类 B 是原型?

很简单,只需要包含proxyMode=ScopedProxyMode.TARGET_CLASS,A 类就知道 B 类是 Prototype 了!

它看起来像下面这样:

@Component
@Scope(value=BeanDefinition.SCOPE_PROTOTYPE, proxyMode=ScopedProxyMode.TARGET_CLASS)
public class B{.....}
于 2021-01-14T17:06:26.857 回答
0

你不能这样做。ApplicationContext 启动后,只会将一个 bean 注入到 child。将为每个父母创建一个新的孩子。

事情是父母只有一个孩子,所以你的2个方法只会调用那个孩子的方法。

你到底想达到什么目的?我确信有一个适当的解决方案。

于 2012-12-10T14:40:42.203 回答