我应该为有状态(?)@Service 选择哪个 @Scope
Which @Scope should I choose for a stateful(?) @Service
我是 Spring 的新手。
我正在做一个依赖于 spring-context
的图书馆项目。
@Scope(value = "@@?")
@Service
public class MyService {
@PostConstruct private void constructed() {
}
@PreDestroying private void destroying() {
resource.clear();
}
public void doSome() throws IOException {
// try{}finally{} is not the case
resource = getSome();
doSome(resource); // may throw an IOException
resource.clear();
}
private transient MyResource resource;
}
我想在每次销毁此实例时释放 resource
。
根据@Scope,我可以选择四个选项。
- ConfigurableBeanFactory.SCOPE_SINGLETON
- ConfigurableBeanFactory.SCOPE_PROTOTYPE
- WebApplicationContext.SCOPE_REQUEST
- WebApplicationContext.SCOPE_SESSION
我发现 WebApplicationContext
在我的依赖树中不可用。 (我不依赖spring-webmvc
)
我打算选择ConfigurableBeanFactory.SCOPE_PROTOTYPE。
我选择的范围是否真的会使 MyService 安全?我的意思是任何两个或多个客户端都不能注入同一个服务实例? Spring 容器会处理它吗?
事实上,Request
、Session
、Global-session
和 Application
范围仅在 Web 感知应用程序上下文中可用。
Singleton
(单个实例 per Spring 容器)是 Spring 使用的默认作用域,因此使用原型作用域将保证将创建新实例并将其返回给客户端,因此在这种情况下,是的 Prototype
就是您所需要的。
我是 Spring 的新手。
我正在做一个依赖于 spring-context
的图书馆项目。
@Scope(value = "@@?")
@Service
public class MyService {
@PostConstruct private void constructed() {
}
@PreDestroying private void destroying() {
resource.clear();
}
public void doSome() throws IOException {
// try{}finally{} is not the case
resource = getSome();
doSome(resource); // may throw an IOException
resource.clear();
}
private transient MyResource resource;
}
我想在每次销毁此实例时释放 resource
。
根据@Scope,我可以选择四个选项。
- ConfigurableBeanFactory.SCOPE_SINGLETON
- ConfigurableBeanFactory.SCOPE_PROTOTYPE
- WebApplicationContext.SCOPE_REQUEST
- WebApplicationContext.SCOPE_SESSION
我发现 WebApplicationContext
在我的依赖树中不可用。 (我不依赖spring-webmvc
)
我打算选择ConfigurableBeanFactory.SCOPE_PROTOTYPE。
我选择的范围是否真的会使 MyService 安全?我的意思是任何两个或多个客户端都不能注入同一个服务实例? Spring 容器会处理它吗?
事实上,Request
、Session
、Global-session
和 Application
范围仅在 Web 感知应用程序上下文中可用。
Singleton
(单个实例 per Spring 容器)是 Spring 使用的默认作用域,因此使用原型作用域将保证将创建新实例并将其返回给客户端,因此在这种情况下,是的 Prototype
就是您所需要的。