2

開発のためにコード ベースをパートナーと共有する必要がありますが、一部のサービスの実装を公開したくありません。

インターフェイスFooServiceとその実装があるとしますFooServiceImpl

public interface FooService
{
    void doSomething();
}

@Service
public class FooServiceImpl implements FooService
{
    @Override
    public String doSomething();
    {
        ...
    }
}

他の多くのクラスがこのサービスを自動配線し、doSomething() を呼び出します。例えば:

@Service
public class BarServiceImpl implements BarService
{
    @Autowired
    private FooService  fooService;

    @Override
    public String validate();
    {
        fooService.doSomething();
        ...
    }
}

を削除するだけFooServiceImplでは、もちろんNoSuchBeanException起動中に a がスローされます。@Autowired(required = false)FooService が自動配線されているすべての場所で使用すると、呼び出されるたびに実行時に aがNullPointerExceptionスローされますdoSomething()

FooServiceImpl の各メソッド本体を手動で削除する以外に、これを回避する方法はありますか?

どんな助けでも大歓迎です。

4

4 に答える 4

2

私はクリリスに同意します。あなたのユースケースは、デフォルトの実装を出荷する必要があるようです。また、ライブラリのユーザーが独自の実装を提供できるようにコードを構成します。@Conditional...Spring では、アノテーションを使用してこれを簡単に行うことができます。具体的には、 を使うべきだと思います@ConditionalOnMissingBean

デフォルトの実装

@Component
public class DefaultFooServiceImpl implements FooService {
  @Override
  public void doSomething() {
    LOG.info("Using default implementation of doSomething(); nothing will happen");
  }
}

サンプル構成

@Configuration
public class ServiceConfig {
  @ConditionalOnMissingBean(FooService.class)
  @Bean
  DefaultFooServiceImpl defaultFooServiceImpl() {
    return new DefaultFooServiceImpl();
  }
}

パートナーがライブラリを使用すると、デフォルトの実装と、より優れた実装を提供するオプションが提供されます。ライブラリを使用すると、ProprietaryFooServiceImplBean を作成でき、代わりに注入されます。

于 2017-01-06T16:27:00.843 に答える
1

Spring で実装せずにインターフェイスを自動配線できますか?

いいえ。

Java では不可能なインターフェイスのインスタンスを作成しようとしています。

于 2017-01-06T02:58:14.860 に答える
1

まず、@AdrianShum と @chrylis がコメントしたように、機能するにはFooServiceforの実装が必要BarServiceImpl.validate()です。したがって、「一部のサービスの実装を公開したくない」という意味が明確ではありません。

  • NoSuchBeanException -FooServiceで自動配線しているため、タイプBarServiceImplの Bean を見つけるためにスキャンが行われます。FooServiceの実装がないためFooService、このエラーが発生します。
  • NullPointerException -のようrequired=falseに、上記の問題は初期化中に無視されます。しかし、明らかに価値private FooService fooServiceがあります。NULLしたがって、 を呼び出すと例外が発生しますfooService.doSomething()
  • 今、あなたは思うかもしれません、あなたは@Componentあなたのinterface. Spring ドキュメントから、「このアノテーションは、実装クラスがクラスパス スキャンによって自動検出されるためのものです」。次に、実装クラスがないため、NoSuchBeanExceptionが発生します。

したがって、Spring で実装せずにインターフェースを自動配線することはできません。

于 2017-01-06T04:24:33.023 に答える
0

ここに画像の説明を入力してください返信が遅くなって申し訳ありません... 実際、最近この問題に直面しました。これは実際には複数のパッケージが原因です。これは、以下の簡単なポイントで解決できます。

  1. Spring プロジェクトを作成する場合、プロジェクトにはメイン パッケージが 1 つだけ含まれている必要があります。
  2. 別のパッケージが必要な場合は、メイン パッケージのサブパッケージとして他のパッケージを作成する必要があります。
  3. デフォルトでは、Spring はランタイムでメイン パッケージをスキャンします。したがって、別のパッケージを作成すると、Spring はそのパッケージをメイン パッケージとは見なしません。
  4. したがって、これらすべてのタイプの @Autowired および Bean の考慮事項の問題を解決するには、他のすべてのパッケージをサブパッケージとして定義する必要があります...

---> それでも疑問がある場合は、以下のコマンドを実行してください...私はフォローします..

于 2022-02-15T08:44:41.497 に答える