有没有办法合并将WebMvcConfigurerAdapter和WebSecurityConfigurerAdapter扩展为一个@Configuration的@Configurations?

时间:2016-07-01 19:29:27

标签: java spring spring-mvc spring-security

我想将两种配置合并为一种配置。以下是他们目前的看法:

WebMvcConfigurerAdapter

@Configuration
@EnableWebMvc
@Import(...)
public class WebApplicationConfig extends WebMvcConfigurerAdapter {


    @Override
    public void configureAsyncSupport(AsyncSupportConfigurer configurer) {
     //...
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        //...
    }

    @Override
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) {
        //...
    }

    @Override
    public void configurePathMatch(PathMatchConfigurer configurer) {
        //...
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //...
    }

WebSecurityConfigurerAdapter

@EnableAsync
@EnableScheduling
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(
        basePackages = {"..."})
@Import({
        ...
})
@PropertySources({
        @PropertySource("..."),
        @PropertySource(
                ignoreResourceNotFound = true,
                value = "...")
})
@EnableWebSecurity
@Configuration
public class AdminConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //...
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        //...
    }

我已经查看了Spring类层次结构,发现它们并没有以任何方式扩展相关的类。是否有替换它们的注释?这可以通过实现接口而不是扩展类来解决吗?

我想合并这些的原因是因为我想要一个配置,这样我就不必考虑在我测试我的应用时使用哪一个。

2 个答案:

答案 0 :(得分:3)

我不建议将它们放在同一个班级。出于同样的原因,这是不可取的,因为您没有将所有逻辑塞入单个类中。保持您的配置简洁明了。更糟糕的是,这有时候真的会变得讨厌w /循环bean引用。

我建议你做一些作文来解决你的问题:

@Configuration
@Import({AdminConfig.class, WebApplicationConfig.class})
public class TheConfig {}

现在您可以参考TheConfig

或者,如果这只是测试,您可以将配置放在meta annotation上,例如:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@ContextConfiguration(classes = {..})
public @interface TheTests { }

最后,如果你真的想要使用一个类,你可以这样做:

@EnableWebMvc
@Import(...)
@EnableAsync
@EnableScheduling
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(
        basePackages = {"..."})
@Import({
        ...
})
@PropertySources({
        @PropertySource("..."),
        @PropertySource(
                ignoreResourceNotFound = true,
                value = "...")
})
@EnableWebSecurity
@Configuration
public class TheConfig extends WebSecurityConfigurerAdapter  implements WebMvcConfigurer {
    ...
}

此问题的另一个问题是WebMvcConfigurerAdapter已提供,因此您无需在API中实施所有方法(仅限您需要的方法)。更重要的是它可以保护您免受可能添加方法的界面内的更改。

答案 1 :(得分:0)

最简单和最惯用的方法是使每个配置器成为顶级network_host_tests类的静态嵌套类:

@Configuration

导入顶级类,Spring也将导入嵌套配置。