目录
一、使用 @ConfigurationProperties + @Component 注解
二、使用 @ConfigurationProperties + @EnableConfigurationProperties 注解
4.2 @EnableConfigurationProperties与@component
4.3 @Configuration与@AutoConfiguration
问题:
- 项目启动报错找不到配置类
- 接口404
一、使用 @ConfigurationProperties + @Component 注解
如果一个类只配置了 @ConfigurationProperties 注解,而没有使用 @Component 注解将该类加入到 IOC 容器中,那么它就不能完成配置文件和 Java Bean 的数据绑定。
@Component
@ConfigurationProperties(prefix = "xiaomao")
public class MyConfigurationProperties {
// 省略 get、set、toString 方法
private String name;
private Integer age;
private String gender;
}
这种方式的灵活性较差。当程序变得越来越大,配置属性类也会越来越多,如果每个类都使用 @Component,那么这些配置属性类将会分散在你的整个代码库中。这将使得管理和查找这些配置属性类变得困难。 不建议使用。
二、使用 @ConfigurationProperties + @EnableConfigurationProperties 注解
propertity:
@ConfigurationProperties(prefix = "xiaomao")
public class MyConfigurationProperties {
// 省略 get、set、toString 方法
private String name;
private Integer age;
private String gender;
}
配置类:
@Configuration
@EnableConfigurationProperties({MyConfigurationProperties.class})
public class WebAutoConfiguration implements WebMvcConfigurer {
}
MyConfigurationProperties 有了 @EnableConfigurationProperties 注解之后该实体类就不需要加上 @Component 注解了。
可以在一个配置类中使用 @EnableConfigurationProperties,并将所有的配置属性类作为参数传入。这样做可以使得代码更加清晰,管理和查找配置属性更方便。推荐使用
注意:配置类注解用@Configuration而非@AutoConfiguration
三、包扫描配置
spring boot中的@SpringBootApplication注解默认扫描主类当前包及子包。自定义了@SpringBootApplication的scanBasePackages属性后不会走默认扫描主类当前包及子包的逻辑,而是认定只扫描自定义配置的包路径,所以如果自定义了包路径,如果还要使用本模块的包,需要手动配置上本模块的包路径。
@SuppressWarnings("SpringComponentScan") // 忽略 IDEA 无法识别 ${hbintrade.info.base-package}
@SpringBootApplication(scanBasePackages = {
"${hbintrade.info.base-package}.manifest",
"${hbintrade.info.base-package}.infra"
, "${hbintrade.info.base-package}.system"
})
public class ManifestServerApplication {
public static void main(String[] args) {
SpringApplication.run(ManifestServerApplication.class, args);
}
}
一般包扫描配置错误的话,会导致bean找不到、接口404等一系列问题。
四、配置类常用注解含义
4.1 @ConfigurationProperties
主要用于简化从配置文件(如 application.properties 或 application.yml)中读取配置属性并将其绑定到 Java 对象上的过程。
- 属性绑定:通过 @ConfigurationProperties 注解,可以将配置文件中的属性值直接绑定到 Java 类的属性上,而不需要手动地为每个属性写 setter 方法或使用其他方式来设置属性值。
- 前缀支持:可以通过 prefix 属性指定配置项的前缀。
- 自动配置:当你使用 @ConfigurationProperties 时,Spring 会自动创建一个配置类来管理这些属性。如果该类被声明为 @Component 或者在一个配置类内作为 @Bean 创建,那么这些属性就会被自动注入到容器中。
- 校验支持:@ConfigurationProperties 支持 JSR 303 或 JSR 380 的数据校验注解,如 @NotNull、@Min、@Max 等,这有助于确保配置项的有效性。
- 宽松绑定:Spring Boot 提供了宽松的绑定机制,这意味着配置文件中的属性名称不必严格匹配 Java 属性名称,例如,配置文件中的 database.max-size 可以绑定到 maxSize 属性上。
- 复杂对象绑定:不仅可以绑定基本类型的属性,还可以绑定复杂的对象结构。例如,配置文件中的嵌套属性可以映射到 Java 类的嵌套对象上。
4.2 @EnableConfigurationProperties与@component
- @Component 是 Spring 框架中的一个注解,用于标记一个 Java 类作为一个 Spring Bean
@EnableConfigurationProperties
是 Spring Boot 提供的一个特殊注解,用于启用@ConfigurationProperties
注解的支持
4.3 @Configuration与@AutoConfiguration
- @Configuration 注解用于标记一个类作为 Spring 的配置类
- @EnableAutoConfiguration 注解用于启用 Spring Boot 的自动配置功能。通过读取
spring.factories
文件里面的EnableAutoConfiguration下面指定的类,来初始化指定类下面的所有加了@bean
的方法,并初始化这个bean