1. 程式人生 > 其它 >8.配置繫結(如何將properties配置檔案中的內容,封裝到javabean中)

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;
    ...
}