准备工具
postman idea 手
1.配置文件
springboot的配置文件默认有三种但是都以applicaation开头分别有三种格式分别为properties,yml,yaml。
注意:springboot的配置文件必须是application.xxx
虽然有三种配置文件但是存在加载优先级。为properties文件 > yml 文件> yaml文件
其中yml文件和yaml文件的语法一样,properties文件的语法与后两个不一样。
yaml和yml为标记语言具体语法为:
k:(空格)v:表示一堆键值对(空格必须有)
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一层级的。
server:
port: 9000
path: /hello
字符串默认不用加上单引号或者双引号
"":双引号 不会转义字符串里的特殊字符;特殊字符会作为本身想要表示的意思name:"zhangsan\n lisi"
输出:zhangsan换行 lisi
'':单引号 会转义特殊字符,特殊字符最终只是一个普通的字符串数据name:'zhangsan\n lisi'
输出:zhangsan\n lisi
对象、Map(属性和值)键值对
k :v :在下一行来写对象的属性和值的关系;注意空格控制缩进
对象还是k:v的方式
frends: lastName: zhangsan age: 20 //行内写法 friends: {lastName: zhangsan,age: 18} //数组 pets: ‐ cat ‐ dog ‐ pig //行内写法 pets: [cat,dog,pig]
本文以application.properties文件作为演示yaml与yml文件时类似的操作。
application.properties配置文件中输入以下内容
person.name=zhangsan
person.age=12
person.boss=false
person.last-name=lisi
person.maps.k1=v1
person.maps.k2=v2
person.lists=a,b,c
person.dog.name=wanghuahu
person.dog.age=15
因为properties默认的编码格式为GBK所以说中文会乱码。
然后我们需要构建实体类---(bean层)
因为配置文件中我们存在两个实体,一个是person,一个dog,仔细看person.dog因为有多个属性,所以我们将dog设置为实体会更方便映射。
目录结构如下图:
person需要构建的属性与配置文件中的想同,当然也可以少构建与多构建,只是多构建在引用时会报错。
@Data @Component public class Person { private String name; private String lastName; private Integer age; private Boolean boss; private Date birth; private Map<String, Object> maps; private List<Object> lists; private Dog dog; @Override public String toString() { return "Person{" + "name=" + name + '\'' + ", age=" + age + ", birth=" + birth + ", map=" + maps + ", dog=" + dog + ", list=" + lists + ",lastname=" + lastName + '}'; } }
person实体类中输入以上代码。
@Data @Component public class Dog { private String name; private int age; @Override public String toString() { return "Dog{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
dog实体类中输入以上代码
person实体和dog实体的蕴含属性与配置文件中的属性保持一致,当然可以设置其他的但是多余的会造成没有获取不到。
代码中之所以没有用到get和set方法是因为用到了@Data注解,该注解源自Lombok
插件安装在setting里面的plugins中直接搜索lombok即可当然可能因为设置不同没法用的同学百度一下改一下设置就可以用了,当然也可以idea直接自动生成get和set方法 。
2.映射方法
方案一 @ConfigurationProperties方法
需要在pom.xml文件中导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐configuration‐processor</artifactId>
<optional>true</optional>
</dependency>
然后在person和dog实体中加入代码,来映射配置文件中的内容。
person中加入
@ConfigurationProperties(prefix = "person")
dog中加入
@ConfigurationProperties(prefix = "person.dog")
在下图位置加入即可。
然后利用@Value注解进行映射到具体内容中
举个例子
在controller层中的hellocontroller中加入以下代码
@RestController
public class HelloController {
@Value("${person.name}")
private String name;
@RequestMapping("/index")
public String sayhello() {
System.out.println(name);
return "Hello" + name;}
}
然后启动服务器按路径去申请即可
启动服务器的主程序如下图所示
springbootapplication就是项目服务器的主程序,点击代码块的左侧绿色小三角就可以第一次快捷启动自动配置编译环境,然后就可在右上角利用三角符号进行启动项目。
项目成功启动终端会显示如下,具体情况具体分析可能有部分同学的不一样。
然后我们访问localhost:8080/index就可以得到映射的person实体的name属性当然也可以映射其他的属性改变一下value注解中的映射目标就可以了
当然这种方式的缺陷很大,不支持复杂的业务场景,所以生产不推荐,学习一下还行。
方案二 利用@PropertySource注解
首先新建一个person.properties文件
里面的内容和之前的person一样就是application.properties中的内容。
在person实体类中加入代码
@PropertySource(value = {"classpath:person.properties"})
在这个位置加入
然后利用@ImportResource 注解导入就会生效
新建一个资源文件叫bean.xml 同时在service层下我们需要建立一个新的文件叫helloservice一定要与下面的配置文件中的id属性一样,只要一致叫什么无所谓,这个作用还没搞清楚,大概是像ico容器中注入helloservice组件,里面什么都不用写,建好了扔那就行。
里面包含如下内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="helloservice" class="com.zj.springboot.Bean.Person">
</bean>
</beans>
然后在sprongapplication(服务器主程序)中添加
@ImportResource(locations={"classpath:beans.xml"})
加载配置文件
然后在hellocontroller中加入如下代码
@Autowired
ApplicationContext ioc;
@Autowired
ApplicationContext applicationContext;
@RequestMapping("/testyin")
public Object testHelloService(){
boolean b = ioc.containsBean("helloservice");
System.out.println(b);
Object a =applicationContext.getBean("helloservice");
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(a);
System.out.println(jsonObject);
System.out.println(a);
return a;
}
启动服务器,在postman中测试localhost:8080/testyin,就可以看见配置文件中的内容。
注意:用这个方法时,application.properties中不能有要映射的person类数据,不然会优先映射application.properties中的数据。
方案三 @Configuration+@Bean
同方案二一样需要在service层建立一个新的文件,config层中也要建立一个新文件,因为我懒,service层的就用helloservice了,在config中建立一个文件叫MyAppConfig。里面加入如下代码
@Configuration
public class MyAppConfig {
@Bean
public HelloService helloconfig(){
System.out.println("配置容器添加了helloservice组件");
return new HelloService();
}
}
注意该类的类型为helloservice,为了向配置容器中注入helloservice组件。
同样在helloController中加入以下代码启动服务器。
访问localhost:8080/testconfig,可以访问到映射文件的数据。
@Autowired
ApplicationContext ioc;
@Autowired
ApplicationContext applicationContext;
@RequestMapping("/testconfig")
public Object test_Config(){
boolean b = ioc.containsBean("helloservice");
System.out.println(b);
Object a =applicationContext.getBean("helloservice");
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(a);
System.out.println(jsonObject);
return a;
}
注意:MyAppConfig中的方法类型为servic中的的文件名,因为这种操作相当于将,service层中的HelloWord当成了一个容器里面装的是配置文件中的内容,同样返回的也必须是这个容器的对象,就是new HelloWord 而在需要获取数据时,需要获取的内容还是beans文件里的id,所以说验证时咱们getbean里的参数是helloservice就是相当于从这个容器中将这个内容提取出来了,所以需要这个名字当做索引。