我目前正在使用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"测试"在ServiceB
和ServiceC
之间共享。我如何防止?
P.S。就我而言,依赖性注射太复杂了,无法对服务应用任何修改,这就是为什么我需要一种方法来将spring-ioc
依赖项注入配置以一种为每个客户端会话创建私有属性实例的方式。
弹簧豆是默认的单例,不应包含状态。
单页应用程序(就像您使用Angular创建的那样(应该将状态保存在客户端,并通过每个请求传递信息。
主要原因是当您的后端无状态时,易于扩展并且更可靠,因为如果重新启动后端服务,您将不会放松任何东西。
您只需要通过添加@Scope(scopeName = "prototype")
:
ServiceA
的范围更改为原型 @Scope(scopeName = "prototype")
@Service
public class ServiceA {
}
然后,当ServiceB
和ServiceC
实例化时,将创建分离的ServiceA
并注入它们。
P.S。请注意,仅在ServiceB
和ServiceC
期间创建一个新的原型BEAN实例。这并不意味着每当您访问原型bean的新实例将始终创建。如果您想要这种行为,则需要使用其中一种技术。