java - springboot - spring annotation configuration autowired
Configuración de Java para el interceptor de resorte donde el interceptor está usando beans de resorte autowired (3)
Quiero agregar Spring Mvc Interceptor como parte de la configuración de Java. Ya tengo una configuración basada en XML para esto, pero estoy tratando de pasar a una configuración de Java. Para los interceptores, sé que se puede hacer así a partir de la documentación de primavera.
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor());
}
}
Pero mi interceptor está usando un bean spring autowired en él como sigue:
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
@Autowired
ISomeService someService;
...
}
La clase SomeService se ve como sigue:
@Service
public class SomeService implements ISomeService {
...
}
Estoy usando anotaciones como @Service
para escanear los beans y no los he especificado en la clase de configuración como @Bean
Según tengo entendido, dado que la configuración java usa nuevo para crear el objeto, Spring no inyectará automáticamente las dependencias en él.
¿Cómo puedo agregar los interceptores como este como parte de la configuración java?
Cuando manejas la creación de objetos por ti mismo como en:
registry.addInterceptor(new LocaleInterceptor());
no hay forma de que el contenedor Spring pueda administrar ese objeto por usted y, por lo tanto, realice la inyección necesaria en su LocaleInterceptor
.
Otra forma que podría ser más conveniente para su situación, es declarar el @Bean
administrado en la @Configuration
y usar el método directamente, de esta manera:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public LocaleInterceptor localeInterceptor() {
return new LocaleInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor( localeInterceptor() );
}
}
Solo haz lo siguiente:
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
LocaleInterceptor localInterceptor() {
return new LocalInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeInterceptor());
}
}
Por supuesto, LocaleInterceptor
debe configurarse como un bean Spring en algún lugar (XML, Java Config o usar anotaciones) para que el campo relevante de WebConfig
se inyecte.
La documentación para la personalización general de la configuración MVC de Spring se puede encontrar here , y específicamente para Interceptores vea this sección
Trate de inyectar su servicio como un parámetro constructor. Es simple.
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Autowired
ISomeService someService;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LocaleInterceptor(someService));
}
}
Luego reconfigure su interceptor,
public class LocaleInterceptor extends HandlerInterceptorAdaptor {
private final ISomeService someService;
public LocaleInterceptor(ISomeService someService) {
this.someService = someService;
}
}
Saludos!