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

 

posted @ 2022-05-11 21:31  努力的达子  阅读(236)  评论(0编辑  收藏  举报