常见的spring boot属性注入相关注解
常见的SpringBoot属性注入使用的注解类含以下几种:
@Value
:常用于字段上,将Spring加载到的属性匹配注入到当前实例字段,可通过冒号:设置属性默认值。@Configuration
:作用于类上,声明一个类作为配置类并生成单例到Spring容器中。@PropertySource
:作用于类上,读取指定资源文件属性,常与@Configuration
、@ConfigurationProperties
一起使用,可通过application.yml的引入配置取代该注解的使用。@ConfigurationProperties
:作用于类或方法上,将加载到的属性进行前缀匹配,再根据属性名与注解类中的字段名匹配进行属性注入,可与@PropertySource
、@Configuration
一起使用,在配置文件中可通过冒号:设置属性默认值。2.2.0版本后大部分情况下无需再与@Configuration
组合使用
2.2.0版本后新增的属性注入相关注解:
@DefaultValue
:作用域参数上,设置不可变属性时的默认值的注释。@ConstructorBinding
:作用于类或构造方法上,通过通过函数而非set方法进行属性注入,常与@ConfigurationProperties
一起使用,适用于设置不可变属性,建议不可变属性通过构造方法设置而非set方法。@ConfigurationPropertiesScan
:生成指定package下@ConfigurationProperties
注解的属性配置类单例并进行属性注入放入容器管理。
在2.2.0版本之后的@SpringBootApplication
注解添加了@ConfigurationPropertiesScan
的功能,即应用启动时会扫描@SpringBootApplication
注解的启动类所在package及所有子孙package下被@ConfigurationProperties
注解的类并生成相应对象到容器中,因此2.2.0以后的版本@ConfigurationProperties
大部分情况下都可单独使用,不需再与@Configuration
组合生成实例。以下为2.2.0之后的SpringBootApplication
:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
@ConfigurationPropertiesScan
public @interface SpringBootApplication {
...
}
各注解属性注入用例
-
@Value用例
@Value("${server.port:8080}") //没有设置则默认设为8080 private String port;
-
@PropertySource用例
classpath添加datasource.properties:
datasource.url=test-url datasource.username=wilson datasource.password=test-password datasource.driver=${db.driver:com.mysql.jdbc.Driver}
属性配置类DataSourceProperties :
@PropertySource("classpath:datasource.properties") @ConfigurationProperties("datasource") @Configuration @Data @Slf4j public class DataSourceProperties { private String url; private String username; private String password; private String driver; @PostConstruct public void init() { log.info(toString()); log.info("DataSourceProperties initialized"); } }
-
@ConfigurationProperties用例
application.yml添加db配置:
datasource: url: test-url username: wilson password: test-password driver: ${db.driver:com.mysql.jdbc.Driver}
也可在resources下新建一个application-datasource.yml进行属性配置,再通过application.yml中添加
spring.profiles.include: datasource
进行文件的属性引入。属性配置类DataSourceProperties :
@ConfigurationProperties("datasource") @Configuration @Data @Slf4j public class DataSourceProperties { private String url; private String username; private String password; private String driver; @PostConstruct public void init() { log.info(toString()); log.info("DataSourceProperties initialized"); } }
-
@ConstructorBinding与@DefaultValue用例
用例1:
@ConfigurationProperties("datasource") @Slf4j @ConstructorBinding @AllArgsConstructor @Getter @ToString public class DataSourceProperties { private String url; private String username; private String password; private String driver; @PostConstruct public void init() { log.info(toString()); log.info("DataSourceProperties initialized"); } }
用例2:
@ConfigurationProperties("datasource") @Slf4j @ConstructorBinding @Getter @ToString public class DataSourceProperties { private String url; private String username; private String password; private String driver; public DataSourceProperties(String url, String username, String password, @DefaultValue("com.mysql.jdbc.Driver") String driver) { this.url = url; this.username = username; this.password = password; this.driver = driver; } @PostConstruct public void init() { log.info(toString()); log.info("DataSourceProperties initialized"); } }
@DefaultValue
注解的参数若没有在配置文件中设置值或默认值,则初始化时使用注解中的值,即注入优先级为:文件属性值>文件属性默认值>@Default
注解值