首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何以个人方式配置spring-ioc依赖注入?

如何以个人方式配置spring-ioc依赖注入?
EN

Stack Overflow用户
提问于 2019-05-14 23:35:57
回答 2查看 46关注 0票数 0

我目前正在开发一个web应用程序,前端使用Angular 7,后端使用spring-boot (我正在开发一个restful web服务)。我使用@Autowired注解将我的服务注入到彼此和我的rest控制器中。问题是,在我的一些服务中,有一些属性在注入完成时会被共享。我如何防止这种情况发生?

代码语言:javascript
复制
import org.springframework.stereotype.Service;
import org.springframework.beans.factory.annotation.Autowired;

@Service
public class ServiceA {
   private boolean test;
   public ServiceA (){
     test = true;
   }
   public changeValues(){
     test = false;
   }
}

@Service
public class ServiceB {
   @Autowired
   private ServiceA serivceA;
   public void method1() {
     serviceA.changeValues();
   }
}

@Service
public class ServiceC {
   @Autowired
   private ServiceA serivceA;
   public void method2(){
      if(serviceA.getTest()){
        doSomethingNeeded();
      }
   } 
}

public class Application{
  @Autowired
  private ServiceB b;
  @Autowired
  private ServiceC c;

  public static void main(String[] args) {
    b.method1();
    c.method2();
  }
}

在这种情况下,ServiceC中的doSomethingNeeded()方法将无法执行,因为ServiceA的资源“测试”在ServiceBServiceC之间共享。我如何防止这种情况发生?

在我的例子中,依赖注入对于将任何修改应用到服务来说太复杂了,这就是为什么我需要一种方法来配置spring-ioc依赖注入,以便为每个客户端会话创建私有属性的实例。

EN

回答 2

Stack Overflow用户

发布于 2019-05-15 01:41:53

默认情况下,Spring Beans是单例的,不应该包含状态。

单页面应用程序(就像您使用Angular创建的应用程序一样)无论如何都应该在客户端保留状态,并将信息传递给每个请求。

主要原因是当你的后端是无状态的时,它很容易扩展,而且更可靠,因为如果后端服务重新启动,你不会丢失任何东西。

票数 0
EN

Stack Overflow用户

发布于 2019-05-15 03:29:13

您只需通过添加@Scope(scopeName = "prototype")ServiceA的作用域更改为prototype

代码语言:javascript
复制
@Scope(scopeName = "prototype")
@Service
public class ServiceA {

}

然后,在实例化ServiceBServiceC时,将创建单独的ServiceA并将其注入其中。

附注:请注意,只有在实例化ServiceBServiceC期间才会创建一个新的原型bean实例。这并不意味着只要您访问prototype bean,就会创建它们的新实例。如果你想要这样的行为,你需要使用这些technique中的一个。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56134058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档