2 回答

TA貢獻1801條經(jīng)驗 獲得超8個贊
不,讓應(yīng)用程序中的每個類都由 Spring 管理并不是一個好主意。
JPA 實體通常應(yīng)該由 Spring 托管 bean 中的代碼實例化

TA貢獻1835條經(jīng)驗 獲得超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)
....
}
}
現(xiàn)在為 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,導(dǎo)入(例如在 maven 中):
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Spring 可以處理這個,因為 4.x(我猜是 4.1)而不需要任何額外的配置
當然,這種方法消除了將應(yīng)用程序上下文注入工廠的需要,并且通常需要維護工廠
一個缺點是它不允許使用參數(shù)構(gòu)建對象,這些參數(shù)必須在運行時指定。
還有另一種方法,運行時生成子類并結(jié)合@Lookup注釋,這里描述了它,但 IMO Provider 方法更好。
添加回答
舉報