考虑以下代码:

@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的任何方法,该工厂知道ServiceAServiceB,并且只需要User的实例即可实例化UserSpecificService

如果很重要-我将在Spring MVC中使用Facade,尽管我希望它不要依赖于此。

谢谢!

最佳答案

这是一个建议:


使所有有资格成为userSpecificService的服务(我猜这些是ServiceA和serviceB)具有通用接口
让该接口具有两种方法-doUserSpecificThing()isEligibleFor(user)
使用@Autowired List<YourInterface> list
在您的doThingsForUser()方法中,迭代给定接口的所有实例的列表,并针对每个接口检查是否适合给定用户。如果是-调用该方法。

07-24 09:49