我有一个弹簧bean
,它是服务的工厂。类似这样的东西:
public abstract class Serivce {
public abstract Type getType();
}
具体实现:
@Service
public class CarService extends Service {}
@Service
public class BicycleService extends Service {}
工厂的豆子:
@Component
public class ServiceFactory {
private final Map<Type, Service> typeToService = new HashMap<>();
//Autowire'ing services here
//get concrete service method here
}
在我的代码中,我有这样的东西:
@Autowired
public ServiceFactory factory;
public void methodA(Type type) {
Service service = factory.getFor(type);
service.baseMethod();
methodB(type);
}
public void methodB(Type type) {
Service service = factory.getFor(type);
serivce.otherBaseMethod();
}
如您所见,我不得不第二次调用methodB
中的factory
bean。我可以将service
实例传递给methodB()
而不是type
吗?避免再次致电工厂?它安全吗?
如果otherBaseMethod()
是无状态的(不在Service
实例内设置/维护状态(,则可以将bean实例作为methodB()
方法的参数传递,而不会出现任何线程安全问题,例如:
public void methodA(Type type) {
Service service = factory.getFor(type);
service.baseMethod();
methodB(service);
}
private void methodB(Service service) {
service.otherBaseMethod();
}
附带说明一下,我将methodB()
的修饰符更改为private,因为bean参数应该只由类成员提供,以与您的用例一致。
交叉调用otherBaseMethod()
确实不会产生任何副作用
这不是Spring特有的。这是Java特有的。由于在Spring中,我们被鼓励定义尽可能多的无状态Spring服务(一旦创建了bean(,这意味着通常交错调用通常不是问题。