Spring 引导云自动配置 Class 中未加载自定义 Bean
Custom Bean not loaded in Spring Boot Cloud AutoConfiguration Class
我想提供一个特定的 Bean,以便这个 Bean 覆盖 Bean在 Spring 云中 AutoConfiguration class.
先试试
因此我创建了一个配置 class:
@Configuration
public class MyLocalConfig {
@Bean
public ApiClient apiClient() throws IOException {
return ClientBuilder.standard(false).build();
}
}
使用 @Primary
或 @Order
注释确定优先级没有帮助。
第二次尝试(编辑)
我还尝试使用 AutoConfiguration。但即使 @AutoConfigureBefore
注释也被忽略。
@Configuration
@AutoConfigureBefore(KubernetesClientAutoConfiguration.class)
public class LocalKubeAutoConfiguration {
@Bean
public ApiClient apiClient() throws IOException {
return ClientBuilder.standard(false).build();
}
}
我的 Configuration class Beans 总是实例化 在 [= KubernetesClientAutoConfiguration class 中的 44=]Beans。
因此 AutoConfiguration class 不使用我的 Bean.
问题:
- 我的错误是什么?
- 如何确定配置的优先级?
这是我的其他代码:
主要Class
@SpringBootApplication
public class SpringBootAdminApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApp.class, args);
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>testme</artifactId>
<version>1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-all</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
</project>
主要class
添加@SpringBootApplication(scanBasePackages = ....)
所以定制的包裹将被扫描
此注释仅告诉 spring 搜索位置。
Spring Boot Cloud 使用 Bootstrap Configuration 加载配置。
By default, bootstrap properties (not bootstrap.properties but
properties that are loaded during the bootstrap phase) are added with
high precedence, so they cannot be overridden by local configuration.
因此我必须添加一个 BootstrapConfiguration:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.demo.LocalKubeConfig
BootstrapConfiguration中的Bean会在KubernetesClientAutoConfiguration之前加载。
我想提供一个特定的 Bean,以便这个 Bean 覆盖 Bean在 Spring 云中 AutoConfiguration class.
先试试
因此我创建了一个配置 class:
@Configuration
public class MyLocalConfig {
@Bean
public ApiClient apiClient() throws IOException {
return ClientBuilder.standard(false).build();
}
}
使用 @Primary
或 @Order
注释确定优先级没有帮助。
第二次尝试(编辑)
我还尝试使用 AutoConfiguration。但即使 @AutoConfigureBefore
注释也被忽略。
@Configuration
@AutoConfigureBefore(KubernetesClientAutoConfiguration.class)
public class LocalKubeAutoConfiguration {
@Bean
public ApiClient apiClient() throws IOException {
return ClientBuilder.standard(false).build();
}
}
我的 Configuration class Beans 总是实例化 在 [= KubernetesClientAutoConfiguration class 中的 44=]Beans。 因此 AutoConfiguration class 不使用我的 Bean.
问题:
- 我的错误是什么?
- 如何确定配置的优先级?
这是我的其他代码:
主要Class
@SpringBootApplication
public class SpringBootAdminApp {
public static void main(String[] args) {
SpringApplication.run(SpringBootAdminApp.class, args);
}
}
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/>
</parent>
<groupId>com.example</groupId>
<artifactId>testme</artifactId>
<version>1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-all</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
</project>
主要class 添加@SpringBootApplication(scanBasePackages = ....) 所以定制的包裹将被扫描 此注释仅告诉 spring 搜索位置。
Spring Boot Cloud 使用 Bootstrap Configuration 加载配置。
By default, bootstrap properties (not bootstrap.properties but properties that are loaded during the bootstrap phase) are added with high precedence, so they cannot be overridden by local configuration.
因此我必须添加一个 BootstrapConfiguration:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.demo.LocalKubeConfig
BootstrapConfiguration中的Bean会在KubernetesClientAutoConfiguration之前加载。