我正在为这个项目使用Spring,但我也和Guice有同样的问题。
基本上,我的功能需要无状态帮助程序和状态数据才能运行。
public class AwesomeDoer {
@Inject
private Helper helper; //stateless
...
public void doAwesome(int state) {
helper.help(state)
}
}
这看起来很不错,直到doAwesome
有5个参数并被调用1000次,但每次参数中有3个是相同的值,而第四个参数可能只改变了几次。将适当的参数更改为字段是显而易见的解决方案。但是,这需要你牺牲这个类的CDI管理,否则你必须有一个初始化器或setter来填充Spring执行它之后的状态。
我通常通过创建一个由Spring管理的工厂来解决这个问题,即
public class AwesomeFactory {
@Inject
private Helper helper;
public AwesomeDoer getAwesomeDoer(int state) {
return new AwesomeDoer(helper, state);
}
}
但同样,这意味着我的AwesomeDoer不再由Spring管理,它需要我编写另一层非业务逻辑。很容易想象这种方法会导致创建一个AwesomeFactoryFactory等,这总会让我在内部死一点。
那么有人有更清洁的方法吗?
答案 0 :(得分:1)
您可以使用Spring中的@Configurable
标记您的bean,并使用new AwesomeDoer
创建它并在构造函数中传递参数。 @Configurable
使您可以根据需要创建bean,并且Spring将管理bean以触发@Autowired
之类的注入。
更多信息:Create a bean using new
keyword and managed by Spring,请查看底部的部分。