Spring 引导:仅将@Configuration 应用于特定包

Spring boot: apply @Configuration to certain package only

我正在使用 @Configuration 配置 cookie,而在我的项目中有 2 个包,我只想将配置应用于其中一个包。
有什么方法可以为 @Configuration 设置目标包吗?

包结构:
--应用
----包A
------MyConfigClass.java
----包B

@EnableJdbcHttpSession(maxInactiveIntervalInSeconds = 1800)
@Configuration
public class MyConfigClass extends WebMvcConfigurerAdapter {
@Bean
    public CookieSerializer cookieSerializer() {
        // I want the follow cookie config only apply to packageA
        DefaultCookieSerializer serializer = new DefaultCookieSerializer();
        serializer.setCookieName("myCookieName");
        serializer.setCookiePath("/somePath/");
        return serializer;
    }
}

你可以试试@ComponentScan("packageA")

检查http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

在 Spring 引导中,用 @SpringBootApplicatio 注释的主要 class 将已经包括 @Configuration@EnableAutoConfiguration@ComponentScan 及其默认值属性,因此您的所有 classes 都将被自动扫描。在 @SpringBootApplication 中使用 exclude 只会排除 classes,但是如果你的包中有很多 classes,代码看起来会很糟糕。

对于您的情况,最简单的方法是将您的主要 Spring 引导应用程序条目 class 移动到您要配置和自动扫描的包中:

----包A

------应用程序

------MyConfigClass.java

----包B

实际上,您可以使用 @ComponentScan 指定要扫描的包,并使用带有排除选项的 @EnableAutoConfiguration 来忽略您想要忽略的 classes。您必须在主应用程序中使用它 class.

@EnableAutoConfiguration(exclude = { Class1.class,
        Class2.class,
        Class3.class }, 
excludeName = {"mypackage.classname"}))
@Configuration
@ComponentScan(basePackages = { "mypackage" })
public class MyApplication {

public static void main(String[] args) throws Exception {
        SpringApplication.run(MyApplication.class, args);
    }
}

或者,您也可以在配置文件中提供要排除的 classes。

# AUTO-CONFIGURATION
spring.autoconfigure.exclude= # Auto-configuration classes to exclude.

如果你想像这样细粒度,我根本不会使用组件扫描。 @SpringBootApplication 是三件事的快捷方式:

  1. 启用自动配置
  2. 在 spring 引导应用程序所在的包中启用组件扫描(包括子包)
  3. 确保 spring 引导应用程序本身是一个配置(以便您可以提供额外的 beans、导入配置等

如果您想要 Spring 仅在特定位置查找配置的启动应用程序,我会这样做:

@Configuration
@EnableAutoConfiguration
@Import(MyConfigClass.class)
public class MySpringBootApp { ... }

IMO,在这种情况下包含您想要的内容比使用排除项进行扫描要清楚得多。也许您可能想要重组您的应用程序,以便您不必首先这样做?使用配置文件是一种选择,这样那些不需要的配置仅在启用配置文件时适用。