Java 实例变量的Spring作用域用法
我们正在实现spring服务,@Webservice层是单例的,它调用一个“服务”层,这是一个原型。服务层有很多实例变量,因此,认为将其作为原型是理想的,但是,由于@Webservice层是单例的,所以该原型看起来只实例化了一次 什么类型的@Scope适合我们?我们在服务层上有很多实例变量,我们很难使它们成为方法的局部变量,因为有很多代码需要更改Java 实例变量的Spring作用域用法,java,spring,web-services,spring-mvc,Java,Spring,Web Services,Spring Mvc,我们正在实现spring服务,@Webservice层是单例的,它调用一个“服务”层,这是一个原型。服务层有很多实例变量,因此,认为将其作为原型是理想的,但是,由于@Webservice层是单例的,所以该原型看起来只实例化了一次 什么类型的@Scope适合我们?我们在服务层上有很多实例变量,我们很难使它们成为方法的局部变量,因为有很多代码需要更改 如果我将所有层都设置为单体,那么两个线程是否共享实例变量 给定一个带有注入目标的单例bean,Spring将初始化bean并立即注入字段/方法/构造函
如果我将所有层都设置为单体,那么两个线程是否共享实例变量 给定一个带有注入目标的单例bean,Spring将初始化bean并立即注入字段/方法/构造函数。如果注入目标是一个原型bean,Spring将只执行一次 据推测,您希望单例处理的每个动作或事件都有一个新的原型bean。您需要一个AOP范围的代理。这在关于的Spring一章中有记录。通过配置作用域代理,Spring将注入代理而不是原型bean 代理本身将把对它的所有调用委托给一个原型bean,每次都是一个新实例 通过注释配置,您可以使用
@Scope(scopeName = BeanDefinition.SCOPE_PROTOTYPE, proxyMode = ScopedProxyMode.TARGET_CLASS)
这告诉Spring使用代理来配置bean,代理将继承目标的实际类类型并成为原型
当你注射它的时候
@Autowired
private MyPrototypeBean bean;
bean
将保存对代理对象的引用。然后可以调用方法
bean.method();
这将委托给一个新实例。这意味着每次通话
bean.method();
bean.method();
bean.method();
将操作一个新实例,上面示例中的三个新实例。如果只需要一个实例来调用这些方法,可以从代理中提取它。请参阅提供的解决方案
作用域代理原型。@SotiriosDelimanolis您能详细说明一下吗?@SotiriosDelimanolis注释中是否有与此等效的内容?是,
@org.springframework.context.annotation.Scope
。
MyPrototypeBean target = null;
if (AopUtils.isJdkDynamicProxy(proxy)) {
target = (MyPrototypeBean) ((Advised)proxy).getTargetSource().getTarget();
} // won't work for CGLIB classes AFAIK (gotta search)