2013-07-18 44 views
0

我已经将我的代码从Spring的XML配置移到了Java配置中。我有一切工作,但我有一个关于我如何实现原型bean的问题 - 主要是,虽然我在做什么工作,它是做到这一点的最佳方式?不知何故,它感觉不到!Spring的Javaconfig和原型豆

我写的bean类是这样的:

@Component 
@Scope("prototype") 
public class ProtoBean { 
    ... 
} 

然后用豆 - 这是我只是不知道的一部分,尽管它的工作:

@Component 
public class BeanUser implements ApplicationContextAware { 
    ApplicationContext context; 

    @Override 
    public void setApplicationContext(ApplicationContext context)throws BeansException 
    { 
     this.context = context; 
    } 

    public void getProtoBean() { 
     ProtoBean protoBean = context.getBean(ProtoBean.class); 
    } 
} 

这给我一个原型bean,在单元测试中,我只是嘲笑上下文,用模拟器调用setApplicationContext,并且模拟器的getBean调用返回一个模拟ProtoBean。所以一切都很好。

我在XML中使用了一个工厂来完成这项工作,但这似乎没有工作得太好,所以这就是我最终选择的地方。但是有没有办法做到这一点没有上下文?或者只是一个更好的方法?

谢谢!

+0

您目前没有使用基于Java的配置。看看这里http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-java – Bart

+0

这是一个有趣的链接 - 谢谢。我正在使用@ComponentScan在我的java配置类中选择它,所以它看起来似乎以相同的方式工作,有趣的是,这与他们给出的第一个例子相匹配 - 然后他们继续谈论“方法注入”这似乎是他们建议的解决方案。 谢谢! –

回答

1

我不认为是Spring XML与基于Java的配置的问题,而是匹配依赖范围之一。由于Spring只能在创建时对单例作用域bean执行依赖注入,所以你必须按需查找原型作用域的bean。当然,当前的bean查找方法起作用,但会在ApplicationContext上创建依赖关系。我可以提出其他一些可能性,但问题的根源实际上是生产ProtoBean的原因,以及您应该接受什么样的折衷。

您可以使BeanUser本身的原型范围,这将允许您在ProtoBean作为成员连线。当然,权衡是你现在对BeanUser的客户端有同样的问题,但有时这不会是一个问题。

另一条路径可能使用类似于单例作用域的ProtoBeanFactory来提供ProtoBean实例,并在ProtoBeanFactory中隐藏依赖关系查找。

最后,您可以使用scoped-proxy bean来有效地隐藏工厂。它使用AOP来做到这一点,并不总是让别人清楚你有什么样的巫术。使用XML,你可以在bean声明上使用<aop:scoped-proxy/>。对于您要使用的注释:

@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS, value = "prototype")