常见的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`注解值