问题描述
当使用@ConfigurationProperties注解去标记配置类的时候,然后使用@EnableConfigurationProperties去装配配置类,被@ConfigurationProperties注解的配置类的bean名称会有些特殊的地方,而不是简单的类名的首字母小写。
示例代码
被@ConfigurationProperties标记的配置类如下:
@Data
@ConfigurationProperties(prefix = "login.config")
public class ConfigVariable {
private int taskPoolSize;
private boolean redissonConfigEnabled;
}
自动装配类如下:
//@Configuration
@EnableConfigurationProperties(ConfigVariable.class)
@ComponentScan(basePackages = {"com.xquant.watch"})
public class LoginAutoConfiguration {
}
当使用这样的装配方式时,ConfigVariable 的beanName并不是configVariable ,而是采用了prefix-类的全限定名称(SpringBoot版本为2.3.12.RELEASE)。此时如果你在其他地方使用了类似@DependsOn(beanName)这样指定具体beanName的注解等情况:
@Bean
@DependsOn("configVariable")
public Scheduler scheduler() throws SchedulerException {
//省略代码
}
启动项目就会收到这样的报错
required a bean named ‘configVariable’ that could not be found
根据类型去获取一把beanName,如图所示:
spring的处理
关于配置类的处理在ConfigurationPropertiesBeanRegistrar源码中是这样的:
void register(Class<?> type, MergedAnnotation<ConfigurationProperties> annotation) {
String name = getName(type, annotation);
if (!containsBeanDefinition(name)) {
registerBeanDefinition(name, type, annotation);
}
}
private String getName(Class<?> type, MergedAnnotation<ConfigurationProperties> annotation) {
String prefix = annotation.isPresent() ? annotation.getString("prefix") : "";
return (StringUtils.hasText(prefix) ? prefix + "-" + type.getName() : type.getName());
}