Spring将组件作为方法中的参数传递



我有一个弹簧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中的factorybean。我可以将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(,这意味着通常交错调用通常不是问题。

最新更新