Java config。の一部としてspring mvcインターセプターを追加したい。このためのxmlベースの構成をすでに持っているが、Java configインターセプターについては、春のドキュメントからこのようにできることを知っています。
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor());
}
}
しかし、私のインターセプターは、次のように自動接続されたスプリングBeanを使用しています。
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
@Autowired
ISomeService someService;
...
}
SomeServiceクラスは次のようになります。
@Service
public class SomeService implements ISomeService {
...
}
Beanのスキャンに@Service
などの注釈を使用していますが、構成クラスで@Bean
として指定していません
私の理解では、Java configはオブジェクトの作成にnewを使用するため、springは依存関係を自動的にオブジェクトに挿入しません。
Java configの一部としてこのようなインターセプターを追加するにはどうすればよいですか?
以下を実行してください。
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
LocaleInterceptor localInterceptor() {
return new LocalInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeInterceptor());
}
}
もちろん、LocaleInterceptor
の関連フィールドを取得するには、WebConfig
をSpring Beanとしてどこかに設定する必要があります(XML、Java Configまたはアノテーションを使用))注入された。
SpringのMVC構成の一般的なカスタマイズに関するドキュメントは here にあります。特にインターセプターについては this セクションを参照してください。
次のように自分でオブジェクトの作成を処理する場合:
registry.addInterceptor(new LocaleInterceptor());
springコンテナがそのオブジェクトを管理する方法はないため、LocaleInterceptor
に必要な注入を行います。
状況により便利な別の方法は、マネージ@Bean
の中に @Configuration
そして、次のようにメソッドを直接使用します。
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public LocaleInterceptor localeInterceptor() {
return new LocaleInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( localeInterceptor() );
}
}
サービスをコンストラクターパラメーターとして注入してみてください。簡単です。
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
ISomeService someService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor(someService));
}
}
次に、インターセプターを再構成し、
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
private final ISomeService someService;
public LocaleInterceptor(ISomeService someService) {
this.someService = someService;
}
}
乾杯!