2 回答
TA贡献1835条经验 获得超7个赞
我通常使用以下方法:
定义将包含对工厂的依赖的单例 bean:
public class MyService {
private final Provider<Book> bookFactory;
public MyService(Provider<Book> bookFactory) {
this.bookFactory = bookFactory;
}
public void doSomething() {
Book book = bookFactory.get();
book.setNumberOfReaders(numOfReaders); // this is a drawback, book is mutable, if we want to set runtime params (like numberOfReaders)
....
}
}
现在为 book bean 定义一个原型:
@Configuration
public class MyConfiguration {
@Bean
@Scope("prototype")
public Book book(...) {
return new Book(...);
}
@Bean // scope singleton by default
public MyService myService(Provider<Book> bookFactory) {
return new MyService(bookFactory);
}
}
注意,Provider 的类型是“javax.inject.Provider”,为了使用 id,导入(例如在 maven 中):
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Spring 可以处理这个,因为 4.x(我猜是 4.1)而不需要任何额外的配置
当然,这种方法消除了将应用程序上下文注入工厂的需要,并且通常需要维护工厂
一个缺点是它不允许使用参数构建对象,这些参数必须在运行时指定。
还有另一种方法,运行时生成子类并结合@Lookup注释,这里描述了它,但 IMO Provider 方法更好。
添加回答
举报