如何做到用java读取properties文件中的内容,并且将其封装到JavaBean中,以供随时使用。
public class getProperties {
public static void main(String[] args) throws FileNotFoundException, IOException {
Properties pps = new Properties();
pps.load(new FileInputStream("a.properties"));
Enumeration enum1 = pps.propertyNames();//得到配置文件的名字
while(enum1.hasMoreElements()) {
String strKey = (String) enum1.nextElement();
String strValue = pps.getProperty(strKey);
System.out.println(strKey + "=" + strValue);
//封装到JavaBean。
}
}
}
@ConfigurationProperties
Spring源码中大量使用了ConfigurationProperties注释,比如server.port就是由该注释获取到的,通过与其他注释配合使用,能够实现Bean的按需配置。
该注释有一个prefix属性,通过指定的前缀,绑定配置文件中的配置,该注释可以放在类上,也可以放在方法上
/**
* 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
*/
@Component
@ConfigurationProperties(prefix = "mycar")//将car中的brand和price和配置中的maycar进行绑定,prefix是前缀的意思
public class Car {
private String brand;
private Integer price;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Integer getPrice() {
return price;
}
public void setPrice(Integer price) {
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", price=" + price +
'}';
}
}
上面是绑定的一个小例子。
事实上,在SpringBoot中注释@ConfigurationProperties有三种使用场景:
使用@ConfigurationProperties和==@Component注释到bean定义类==上
这里@Component将类定义为一个Bean的注释,何为注解?注解本质上就是一个类,开发中我们可以使用注解 取代 xml配置文件。web开发,提供3个@Component注解衍生注解(功能一样)取代 @Repository(“名称”):dao层 @Service(“名称”):service层 @Controller(“名称”):web层
// 将类定义为一个bean的注解,比如 @Component,@Service,@Controller,@Repository
// 或者 @Configuration
@Component
// 表示使用配置文件中前缀为user1的属性的值初始化该bean定义产生的的bean实例的同名属性
// 在使用时这个定义产生的bean时,其属性name会是Tom
@ConfigurationProperties(prefix = "user1")
public class User {
private String name;
// 省略getter/setter方法
}
对应的application.properties配置文件内容如下:
user1.name=Tom
在此种场景下,当Bean被实例化时,@ConfigurationProperties会将对应前缀的后面的属性与Bean对象的属性匹配。符合条件则进行赋值。
使用@ConfigurationProperties和==@Bean注解在配置类的Bean定义方法==上。
@Configuration
public class DataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
//Spring的bean中有name属性,可以用来区分两个相同(部分属性不一样)的bean。
@ConfigurationProperties(prefix="spring.datasource.primary")
public DataSource primaryDataSource() {
return DataSourceBuilder.create().build();
}
}
这里便是将前缀为“spring.datasource.primary”的属性,赋值给DataSource对应的属性值。@Configuration注解的配置类中通过@Bean注解在某个方法上将方法返回的对象定义为一个Bean,并使用配置文件中相应的属性初始化该Bean的属性。
使用@ConfigurationProperties注解在普通类的Bean定义方法上。
@EnableConfigurationProperties(XXX.class)1.开启XXX的属性配置绑定功能 2.把XXX这个组件自动注册到容器中
使用方法是:使用@ConfigurationProperties注解到普通类,然后再通过@EnableConfigurationProperties定义为Bean。
@ConfigurationProperties(prefix = "user1")
public class User {
private String name;
// 省略getter/setter方法
}
这里User对象并没有使用@Component相关注解。
而该User类对应的使用形式如下:
@SpringBootApplication
@EnableConfigurationProperties({User.class})
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
该方法非常适用于拿到一个第三方类,但是又不想修改其代码,可以在使用的时候,自己将其搞一个bean