GVKun编程网logo

@ConfigurationProperties 注解对数据的自动封装(springautowired注解与自动装配)

4

本篇文章给大家谈谈@ConfigurationProperties注解对数据的自动封装,以及springautowired注解与自动装配的知识点,同时本文还将给你拓展@Configuration+@C

本篇文章给大家谈谈@ConfigurationProperties 注解对数据的自动封装,以及springautowired注解与自动装配的知识点,同时本文还将给你拓展@Configuration+@ConfigurationProperties+@EnableConfigurationProperties、@ConfigurationProperties、@ConfigurationProperties + @EnableConfigurationProperties、@ConfigurationProperties 和 @Value等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

@ConfigurationProperties 注解对数据的自动封装(springautowired注解与自动装配)

@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

 @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

有时候有这样子的情景,我们想把配置文件的信息,读取并自动封装成实体类,这样子,我们在代码里面使用就轻松方便多了,这时候,我们就可以使用@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

@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

@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的相关信息,请在本站查询。

本文标签: