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 せずに構築できる方法はありますか?ServiceAServiceBUserUserSpecificService

重要な場合-Facadeこれに依存しないようにしたいのですが、SpringMVCでを使用します。

ありがとう!

4

2 に答える 2

1

ここに提案があります:

  • 対象となるすべてのサービスuserSpecificService(これらはServiceAとserviceBだと思います)に共通のインターフェースを持たせる
  • そのインターフェースに2つのメソッドを持たせます-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();
    } 
}

@Configurableをスキャンするには、Springコンテキストを構成する必要があることに注意してください。これを行うには<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 に答える