本篇文章给大家谈谈@ConfigurationProperties注解对数据的自动封装,以及springautowired注解与自动装配的知识点,同时本文还将给你拓展@Configuration+@C
本篇文章给大家谈谈@ConfigurationProperties 注解对数据的自动封装,以及springautowired注解与自动装配的知识点,同时本文还将给你拓展@Configuration+@ConfigurationProperties+@EnableConfigurationProperties、@ConfigurationProperties、@ConfigurationProperties + @EnableConfigurationProperties、@ConfigurationProperties 和 @Value等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- @ConfigurationProperties 注解对数据的自动封装(springautowired注解与自动装配)
- @Configuration+@ConfigurationProperties+@EnableConfigurationProperties
- @ConfigurationProperties
- @ConfigurationProperties + @EnableConfigurationProperties
- @ConfigurationProperties 和 @Value
@ConfigurationProperties 注解对数据的自动封装(springautowired注解与自动装配)
@ConfigurationProperties 注解对数据的自动封装
@ConfigurationProperties 可以对基本数据类型实现自动封装,可以封装格式为 yyyy/MM/dd 的日期
测试代码:
package aat;
import java.util.Date;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;
/**
* 使用@ConrigurationProperties注解封装配置文件中的数据
*/
@Component
@Data
@ConfigurationProperties(prefix="author")
public class TestProperties {
private String name;
private Integer age;
private String phone;
private Boolean isboy;
private Float ppt;
private Date birthday;
private Date birthday1;
private Date birthday2;
}
配置文件信息:
author:
name: xixihaha
age: 1112
phone: 1234556666
isboy: true
ppt: 1.3
# birthday: 2018-1-1
# birthday1: 20180101
# birthday2: 2018/1/1
如果封装日期类型,需要格式为 yyyy/MM/dd, 可以自动封装,如果为 yyyy-MM-dd 或者为 yyyyMMdd 都会报错:
Description:
Failed to bind properties under ''author.birthday'' to java.util.Date:
Property: author.birthday
Value: 2018-11-11
Origin: class path resource [application.yml]:12:13
Reason: failed to convert java.lang.String to java.util.Date
Action:
Update your application''s configuration
@Configuration+@ConfigurationProperties+@EnableConfigurationProperties
@Configuration+@ConfigurationProperties+@EnableConfigurationProperties

最佳设计方案(现在又改板了):
Bean上面直接设置@ConfigurationProperties
//需要依赖spring-boot-configuration-processor
@ConfigurationProperties(prefix = "stu")
public class Stu {
String name;
public Stu(String name) {
this.name = name;
}
public Stu() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Stu{" +
"name=''" + name + ''\'''' +
''}'';
}
}
方式一:configuration上面跟随@EnableConfigurationProperties【这种情况只有configuration里面一个Bean 】
@Configuration
@EnableConfigurationProperties
public class StuConfiguration {
@Bean
public Stu stu(){
return new Stu();
}
}
方式二:configuration上面跟随@EnableConfigurationProperties【这种情况只有configuration里面一个Bean 】
package com.example.demo11.configuration;
import com.example.demo11.entity.Stu;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
//@EnableConfigurationProperties(Stu.class),如果携带class参数则有用注册Bean的能力,
//因为实现了ImportBeanDefinitionRegistrar接口,Import三插之一
//这里的Bean名称非常有意思【类型名称+全包名】
@EnableConfigurationProperties(Stu.class)
public class StuConfiguration {
@Bean
public Stu stu2(){
return new Stu();
}
}
启动查看
@SpringBootApplication
public class Demo11Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(Demo11Application.class, args);
Stu stu = context.getBean("stu-com.example.demo11.entity.Stu", Stu.class);
System.out.println(context.getBeansOfType(Stu.class).size());
System.out.println(stu.toString());
context.close();
}
}
@ConfigurationProperties
有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@ConfigurationProperties,它可以把同类的配置信息自动封装成实体类
首先在配置文件里面,这些信息是这样子滴
connection.username=admin
connection.password=kyjufskifas2jsfs
connection.remoteAddress=192.168.1.1
这时候我们可以定义一个实体类在装载配置文件信息
@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {
private String username;
private String remoteAddress;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getRemoteAddress() {
return remoteAddress;
}
public void setRemoteAddress(String remoteAddress) {
this.remoteAddress = remoteAddress;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
我们还可以把@ConfigurationProperties还可以直接定义在@bean的注解上,这是bean实体类就不用@Component和@ConfigurationProperties了
@SpringBootApplication
public class DemoApplication{
//...
@Bean
@ConfigurationProperties(prefix = "connection")
public ConnectionSettings connectionSettings(){
return new ConnectionSettings();
}
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
然后我们需要使用的时候就直接这样子注入
@RestController
@RequestMapping("/task")
public class TaskController {
@Autowired ConnectionSettings conn;
@RequestMapping(value = {"/",""})
public String hellTask(){
String userName = conn.getUsername();
return "hello task !!";
}
}
如果发现@ConfigurationPropertie不生效,有可能是项目的目录结构问题,
你可以通过@EnableConfigurationProperties(ConnectionSettings.class)来明确指定需要用哪个实体类来装载配置信息
@Configuration
@EnableConfigurationProperties(ConnectionSettings.class)
public class MailConfiguration {
@Autowired private MailProperties mailProperties;
@Bean public JavaMailSender javaMailSender() {
// omitted for readability
}
}
@ConfigurationProperties + @EnableConfigurationProperties
1、ConfigurationProperties
在类上通过@ConfigurationProperties注解声明当前类为属性读取类。
举例:
@ConfigurationProperties(prefix = "jdbc")
prefix="jdbc" 读取属性文件中,前缀为jdbc的值。
在类上定义各个属性,名称必须与属性文件中 jdbc. 后面部分一致。
需要注意的是,如果我们没有指定属性文件的地址,SpringBoot 默认读取 application.properties/application.yml 中的属性文件名。
@Data
@ConfigurationProperties(prefix = "jdbc")
class JdbcProperties {
private String url;
private String driverClaprivate;
private String username;
private String password;
}
2、EnableConfigurationProperties
@ConfigurationProperties 注解我们可以理解成用来把 properties 配置文件转化为 Bean 使用的,而 @EnableConfigurationProperties 注解的作用是让 @ConfigurationProperties 注解生效。
如果只配置 @ConfigurationProperties 注解,在 IOC 容器中是获取不到 properties 配置文件转化的 Bean 的。
那么我们如何获取我们使用了 @ConfigurationProperties 注解的类呢?
2.1 @Autowired 注入
@Autowired
private JdbcProperties prop;
2.2 构造函数注入
private JdbcProperties prop;
public JdbcConfig(Jdbcproperties prop){
this.prop = prop;
}
2.3 声明有@Bean的方法参数注入
@Bean
public TestBean dataSource(JdbcProperties jdbcProperties) {
syso(jdbcProperties.getUsername());// syso 简写
return new TestBean;
}
通过上方三种方式,都可以在 JdbcProperties jdbcProperties 中直接拿到注入的数据。
@ConfigurationProperties 和 @Value
springboot从配置文件注入属性值的两种方式
1. 使用 @ConfigurationProperties 和 @Configuration
其中,
@Configuration 感觉类似Compnent Service Controller Respository 等注解类似,注入bean的同时起个标识的作用,声明这个类是个配置类。主要用于将配置和其他应用解耦。
@ConfigurationProperties 默认读取配置文件的一级属性
@ConfigurationProperties("***") 和
@ConfigurationProperties(prefix="**")等价,可以根绝前缀读取各级属性
例如,配置文件(yml格式)为
configureFile:
name: yin
age: 28
通过如下方式即可注入属性。
@Configuration
@ConfigurationProperties("configureFile")
@Setter
@Getter
public class ConfigureFile {
private String name;
private int age;
}
2. 通过@Value注入
如下
@Component
public class ValueTest {
@Value("${value}")
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
有时候,我们可能需要注入静态属性,就需要做响应的修改了:
@Component
public class ValueTest {
private static String value;
public String getValue() {
return value;
}
@Value("${value}") //static 类型通过set方法注入
public void setValue(String value) {
ValueTest.value = value;
}
}
我们今天的关于@ConfigurationProperties 注解对数据的自动封装和springautowired注解与自动装配的分享已经告一段落,感谢您的关注,如果您想了解更多关于@Configuration+@ConfigurationProperties+@EnableConfigurationProperties、@ConfigurationProperties、@ConfigurationProperties + @EnableConfigurationProperties、@ConfigurationProperties 和 @Value的相关信息,请在本站查询。
本文标签: