8.配置繫結(如何將properties配置檔案中的內容,封裝到javabean中)
阿新 • • 發佈:2022-05-11
但是有個問題,如果需要繫結的類是個有其他引用的類呢:如何將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; ... }