8.配置绑定(如何将properties配置文件中的内容,封装到javabean中)
如何将properties文件中的内容,封装到javabean中
示例:
在springboot的配置文件中(application.properties文件中)有以下两个配置
mycar.brand=奔驰
mycar.price=13万
有实体类:
public class Car {
private String brand;
private String price;
....
}
现将配置文件中的绑定到实体类上:
1.第一种:使用@ConfigurationProperties标签和一般标签(@ConfigurationProperties标签必须加在容器组件上,例如加了@Component标签的类等等)
@Component
//该标签用来和springboot的配置文件(application.properties)不能是其他文件,进行绑定
//该标签必须加载到组件上,不能单独使用
//prefixs是配置文件中配置项的前缀:mycar.brand=""中的的mycar
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private String price;
...
}
此时获取:
Car car = run.getBean("car", Car.class);
System.out.println(car.toString());
输出:Car{brand='奔驰', price='13万'}
已经绑定
2.第二种:@EnableConfigurationProperties和@ConfigurationProperties共同使用
@EnableConfigurationProperties只能用在@configuration(表示当前类是配置类)标注的类上
例如:
@Configuration
//该注解会往容器中注入car的组件
@EnableConfigurationProperties(Car.class)
public class MyConfiguration {
@ConditionalOnBean(name = "cn.com.entity.Person")
@Bean
public Person getperson() {
return new Person("吴孟达", 18);
}
@Bean
public Dog getDog() {
return new Dog("刘丹", 19);
}
}
实体类:
//实体类上不用加上@Component的注解,因为此时car已经是容器中的组件了,只是组件的name=mycar-cn.com.entity.Car
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private String price;
...
}
结论:
@EnableConfigurationProperties(Car.class)标签加到配置类上,会注册car组件
组件的name=car类上必须标注@ConfigurationProperties(prefix = "mycar")的前缀,
即name=前缀-包名.类名
问题:
使用了@ConfigurationProperties绑定了配置文件后,不管使用@Bean还是@import导入的容器中的bean的属性都是配置文件中的属性
例如:不同的注册方法注册的bean,name不同,但是值是一样的
id:cn.com.entity.Car value:Car{brand='奔驰', price='13万'}
id:getCar value:Car{brand='奔驰', price='13万'}
但是有个问题,如果需要绑定的类是个有其他引用的类呢:
例如:
需要绑定的类代码如:
@ConfigurationProperties(prefix = "mycar")
public class Car {
private String brand;
private String price;
private Person person;
.....
}
person类的代码如下:
public class Person {
private String name;
private Integer age;
...
}
如何进行给person赋值呢:
配置文件这样写:(可以进行逐层赋值)
mycar.brand=奔驰
mycar.price=13万
mycar.person.name=吴孟达
输出:注册的组件name:prefix名称-包名.类名
mycar-cn.com.entity.Car:Car{brand='奔驰', price='13万', person=Person{name='吴孟达', age=null}}
如何引入其他类型配置文件的配置信息呢?
@Component
@ConfigurationProperties(prefix="ge")
@PropertySource(value= {"classpath:company.properties"})
public class CompanyBean implements Serializable {
/**
*
*/
private static final long serialVersionUID = 4349552945449301902L;
/**
* 公司名称
*/
private String companyName;
/**
* 联系方式
*/
private String telphone;
/**
* 法人代表
*/
private String lawPerson;
public CompanyBean() {
super();
// TODO Auto-generated constructor stub
}
public String getCompanyName() {
return companyName;
}
public void setCompanyName(String companyName) {
this.companyName = companyName;
}
public String getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getLawPerson() {
return lawPerson;
}
public void setLawPerson(String lawPerson) {
this.lawPerson = lawPerson;
}
@Override
public String toString() {
return "CompanyBean [companyName=" + companyName + ", telphone=" + telphone + ", lawPerson=" + lawPerson + "]";
}
}
3、如何使用呢?
比如我在表现层使用,只需要用这个类创建个属性,然后通过@Resource注解把它交给spring容器即可
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.ge.springboot.bean.CompanyBean;
import com.ge.springboot.bean.UserBean;
@RequestMapping("/sysmag")
@Controller
public class FreeMarkerController {
@Resource
private CompanyBean companyBean;
...
}