考虑以下代码:
@Service
class UserSpecificService {
@Autowired ServiceA serviceA;
@Autowired ServiceB serviceB;
@Autowired User user;
public void doUserSpecificThings() {
// consume serviceA, serviceB and user here
}
}
@Service class ServiceA {}
@Service class ServiceB {}
@Service
class Facade {
public void doThingsForUser(Long userId) {
User user = userService.getById(userId);
UserSpecificService userSpecificService = ...; // !!!
userSpecificService.doUserSpecificThings();
}
}
问题是关于标有
// !!!
的行。是否可以在不实现自己的工厂的情况下构造UserSpecificService
的任何方法,该工厂知道ServiceA
和ServiceB
,并且只需要User
的实例即可实例化UserSpecificService
?如果很重要-我将在Spring MVC中使用
Facade
,尽管我希望它不要依赖于此。谢谢!
最佳答案
这是一个建议:
使所有有资格成为userSpecificService
的服务(我猜这些是ServiceA和serviceB)具有通用接口
让该接口具有两种方法-doUserSpecificThing()
和isEligibleFor(user)
使用@Autowired List<YourInterface> list
在您的doThingsForUser()
方法中,迭代给定接口的所有实例的列表,并针对每个接口检查是否适合给定用户。如果是-调用该方法。