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")
在 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
是三件事的快捷方式:
- 启用自动配置
- 在 spring 引导应用程序所在的包中启用组件扫描(包括子包)
- 确保 spring 引导应用程序本身是一个配置(以便您可以提供额外的 beans、导入配置等
如果您想要 Spring 仅在特定位置查找配置的启动应用程序,我会这样做:
@Configuration
@EnableAutoConfiguration
@Import(MyConfigClass.class)
public class MySpringBootApp { ... }
IMO,在这种情况下包含您想要的内容比使用排除项进行扫描要清楚得多。也许您可能想要重组您的应用程序,以便您不必首先这样做?使用配置文件是一种选择,这样那些不需要的配置仅在启用配置文件时适用。
我正在使用 @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")
在 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
是三件事的快捷方式:
- 启用自动配置
- 在 spring 引导应用程序所在的包中启用组件扫描(包括子包)
- 确保 spring 引导应用程序本身是一个配置(以便您可以提供额外的 beans、导入配置等
如果您想要 Spring 仅在特定位置查找配置的启动应用程序,我会这样做:
@Configuration
@EnableAutoConfiguration
@Import(MyConfigClass.class)
public class MySpringBootApp { ... }
IMO,在这种情况下包含您想要的内容比使用排除项进行扫描要清楚得多。也许您可能想要重组您的应用程序,以便您不必首先这样做?使用配置文件是一种选择,这样那些不需要的配置仅在启用配置文件时适用。