如何以个人方式配置春季IOC依赖性注射



我目前正在使用Angular 7用于前端,用于后端的Spring-boot(在其中正在开发RESTful Web服务(上工作。我正在使用@Autowired注释将我的服务注入彼此和我的休息控制器。问题在于,在我的某些服务中,有些属性在注射完成后会共享。我如何防止?

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的Ressource"测试"在ServiceBServiceC之间共享。我如何防止?

P.S。就我而言,依赖性注射太复杂了,无法对服务应用任何修改,这就是为什么我需要一种方法来将spring-ioc依赖项注入配置以一种为每个客户端会话创建私有属性实例的方式。

div class =" ans">

弹簧豆是默认的单例,不应包含状态。

单页应用程序(就像您使用Angular创建的那样(应该将状态保存在客户端,并通过每个请求传递信息。

主要原因是当您的后端无状态时,易于扩展并且更可靠,因为如果重新启动后端服务,您将不会放松任何东西。

您只需要通过添加@Scope(scopeName = "prototype")

ServiceA的范围更改为原型
@Scope(scopeName = "prototype")
@Service
public class ServiceA {
}

然后,当ServiceBServiceC实例化时,将创建分离的ServiceA并注入它们。

P.S。请注意,仅在ServiceBServiceC期间创建一个新的原型BEAN实例。这并不意味着每当您访问原型bean的新实例将始终创建。如果您想要这种行为,则需要使用其中一种技术。

最新更新