SpringBoot中@ConfigurationProperties注解实现配置绑定的三种方法

网友投稿 239 2022-08-02


properties配置文件如下:

human.name=Mr.Yu

human.age=21

human.gender=male

如何把properties里面的配置绑定到javaBean里面,以前我们的做法如下:

public class PropertiesUtil {

public static void getProperties(Person person) throws IOException {

Properties properties = new Prohttp://perties();

properties.load(new FileInputStream("src/main/resources/demo.properties"));

//得到配置文件key的名字

Enumeration enumeration = properties.propertyNames();

while (enumeration.hasMoreElements()){

String key =(String)enumeration.nextElement();

String value = properties.getProperty(key);

System.out.println("key="+key+"——————value="+value);

//封装到JavaBean

//以下内容省略

}

}

}

输出结果:

key=human.name——————value=Mr.Yukey=human.age——————value=21key=human.gender——————value=male

Process finished with exit code 0

可以看到这个过程十分繁杂,但是在SpringBoot中这个过程将会变得非常简单。

在SpringBoot中有如下3种方法:

1.@ConfigurationProperties注解+@Component(或@Controller或@Service或@Repository)注解

只有在容器中的组件,才会拥有SpringBoot提供的强大功能,也就是如果我们需要使用到@ConfigurationProperties注解,那么我们首先要保证该对JavaBean对象在IoC容器中,所以需要用到Component注解来添加组件到容器中。@ConfigurationProperties注解中prefix与value互相都是别名

也就是说@ConfigurationProperties(value = "human")与@ConfigurationProperties(prefix = "human")是一样的prefix和value指的是前缀的意思

代码测试: properties配置文件:

human.name=Mr.Yu

human.age=21

human.gender=male

Person类:

@Component ////只有在容器中的组件,才会拥有SpringBoot提供的强大功能

@ConfigurationProperties(value = "human")

public class Person {

public String name;

public int age;

public String gender;

public Person() {

}

public Person(String name, int age, String gender) {

this.name = name;

this.age = age;

this.gender = gender;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getGender() {

return gender;

}

public void setGender(String gender) {

this.gender = gender;

}

@Override

public String toString() {

return "Person{" +

"name='" + name + '\'' +

", age=" + age +

", gender='" + gender + '\'' +

'}';

}

}

测试类如下:

//@Controller

////@ResponseBody以字符串的方式写给浏览器,而不是跳转到某个页面

//@ResponseBody

//@RestController = @Controller + @ResponseBody

@RestController

public class HelloController {

//自动注入属性

@Autowired

Person person;

@RequestMapping("/person")

public Person getPerson(){

return person;

}

}

测试结果:

@ConfigurationProperties注解+@EnableConfigurationProperties注解

这种方式@EnableConfigurationProperties注解一定要在配置类上写,@EnableConfigurationProperties的意思是开启属性配置功能,开启谁的属性配置功能呢,因为我们上面的Person类想进行配置绑定,所以我们在后面加上参数Person.class:@EnableConfigurationProperties(Person.class)

@EnableConfigurationProperties(Person.class)的作用就是把这个Person组件注册到容器中,对象的名称为:human-com.ysw.boot.properties.Person 其中human是@ConfigurationProperties(value = "human")中前缀value的值

在Person类上还是有@ConfigurationProperties注解,这种方式把Person类上的@Component注解换成了配置类上的@EnableConfigurationProperties(Person.class)注解

这种方式主要用在引用第三方包时,比如第三方包中有一个Person类,该类中没有使用@Component,我们也不能够给第三方包中的类加上@Component,这个时候就可以使用在配置类上加上@EnableConfigurationProperties注解的方法。

@ConfigurationProperties注解+@Import注解

使用@Import给容器中自动创建出这个类型的组件、默认组件的名字就是全类名@Import注解与2中的@ConfigurationProperties注解效果是一样的只不过他们注册到容器中的名称不同:@ConfigurationProperties注解注册到容器中对象的名称为:human-com.ysw.boot.properties.Person 其中human是@ConfigurationProperties(value = "human")中前缀value的值@Import注解注册到容器中对象的名称为:com.ysw.boot.properties.Person

配置类:

Person类:

测试类:

application.properties文件:

server.port=8888

human.name=Mr.Yu

human.age=21

human.gender=male222

测试结果:


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java全面分析面向对象之封装(java对象和封装)
下一篇:SpringBoot配置@Configuration注解和@bean注解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~