0

考虑以下代码:

@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 在不实现我自己的工厂的情况下构建,它知道ServiceAandServiceB并且只需要一个实例User来实例化 a UserSpecificService

如果这很重要 - 我将使用FacadeSpring MVC,尽管我不希望它依赖于此。

谢谢!

4

2 回答 2

1

这里有一个建议:

  • 使所有有资格成为的服务userSpecificService(我猜这些是ServiceA和serviceB)都有一个通用接口
  • 让该接口有两种方法 -doUserSpecificThing()isEligibleFor(user)
  • 利用@Autowired List<YourInterface> list
  • 在您的doThingsForUser()方法中迭代给定接口的所有实例的列表,并为每个实例检查它是否符合给定用户的条件。如果是 - 调用该方法。
于 2012-05-03T20:00:20.300 回答
0

如果您询问是否可以动态创建 UserSpecificService 而无需手动设置服务,请尝试以下操作:

@Configurable
class UserSpecificService {
    @Autowired private ServiceA serviceA;
    @Autowired private ServiceB serviceB;
    private User user;

    public UserSpecificService(User user){
        this.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 = new UserSpecificService(user);
        userSpecificService.doUserSpecificThings();
    } 
}

请注意,您需要配置 spring 上下文以扫描 @Configurable。为此,您所要做的就是添加<context:spring-configured/>到您的应用程序上下文文件中。另一种方法是:

@Service
class UserSpecificService {
    @Autowired private ServiceA serviceA;
    @Autowired private ServiceB serviceB;

    public void doUserSpecificThings(User user) {
        // 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.doUserSpecificThings(user);
    } 
}

根据您的具体应用,这种方法可能会更好。

于 2012-05-03T20:04:25.170 回答