自学尚硅谷Spring Boot (二)

本文深入解析SpringBoot项目结构,探讨Maven配置问题,详细介绍默认生成的项目内容,配置文件(application.properties和application.yml)的使用,YAML语法特性,以及配置文件值注入的方法。同时,对比@Value和@ConfigurationProperties两种注入方式,讲解@PropertySource和@ImportResource的用途,并介绍配置文件占位符的使用。

0.解决(一)中创建maven项目时的问题

看视频找官方文档的相关资料,进行pom.xml的配置,但是配置资源错误,导致maven导包不成功

a467a36dcd11b6d082da6b97ce0f1f46cb2.jpg

看起来长得都差不多,但是经过昨天的学习,开始查找这种错误的源头,maven的配置都一样,为什么maven的包导入不成功?仔细对照两个项目的pom配置文件发现,从spring boot 导入依赖关系文件错误,才导致maven的包导入不进来

emmmm,有点强迫症,解决完这个小bug,心里舒服多了,继续学习spring boot

1.默认生成的spring boot项目

     主程序已经生成好了,我们只需要我们自己的逻辑

     resources文件夹中目录结构

            static:保存所有静态资源;js  css images;

            templates:保存所有的模板页面;(Spring Boot默认从jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、tlymelaf);

            application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

                    配置端口号:

8a15a42a4d77f76a085a584f80ccf742f84.jpg

2.spring boot 的配置文件

    1.配置文件

            Spring Boot使用一个全局的配置文件,配置文件名是固定的

             application.properties

             application.yml

            配置文件的作用:修改spring boot自动配置的默认值;spring boot在底层都给我们自动配置好;

            YAML(YAML  Aln't Markup Language)

                    YAML A Markup Language:是一个标记语言

                    YAML  isn't Markup Language:不是一个标记语言

            标记语言:

                    以前的配置文件;大多都使用的是xxx.xml文件

                    YAML:以数据为中心,比json、xml等更适合做配置文件

                     YAML:配置例子

server:
    port: 8081

                    XML:

<server>
    <port>8081</port>
</server>

3.YAML语法

1.基本语法

k:(空格)v; 来表示键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一层级的

server:
    port: 8081
    path: /hello

属性和值也是大小写敏感

2.值的写法

字面量:普通的值(数字,字符串,布尔)

k: v;字面值直接来写

     字符串默认不用加上单引号或者双引号;

      “”:双引号;不会转义字符串重要的特殊字符;特殊字符会作为本身想表示的意思

                    name:"zhangsan \n lisi";  输出:zhangsan 换行  lisi

       '':单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据

                   name:"zhangsan \n lisi";  输出:zhangsan \n  lisi

对象、map(属性和值)(键值对);

     k: v;  在下一行来写对象的属性和值得关系;注意缩进

         对象还是k、v的方式         

friends:

      lastName:zhangsan

      age:20


行内写法:
friends: {lastName:zhangsan,age:20}

数组(List、Set):

用-值表示数组中的一个元素

pets:
   -cat
   -dog
   -pig

行内写法:
pets: [cat,dog,pig]

3.配置文件值注入

配置文件(YAML)

persion:
  lastName: zhangsan
  age: 18
  boss: false
  birth: 2017/12/12
  maps: {k1: v1,k2: 12}
  lists:
    - lisi
    - zhaoliu
  dog:
    name: 小狗
    age: 2

bean:

package org.jsoft.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
 *      prefix = "persion"  配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 * */

@Component
@ConfigurationProperties(prefix = "persion")
public class Persion {
    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 "Persion{" +
                "lastName='" + lastName + '\'' +
                ", age=" + age +
                ", boss=" + boss +
                ", birth=" + birth +
                ", maps=" + maps +
                ", lists=" + lists +
                ", dog=" + dog +
                '}';
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Boolean getBoss() {
        return boss;
    }

    public void setBoss(Boolean boss) {
        this.boss = boss;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    public Map<String, Object> getMaps() {
        return maps;
    }

    public void setMaps(Map<String, Object> maps) {
        this.maps = maps;
    }

    public List<Object> getLists() {
        return lists;
    }

    public void setLists(List<Object> lists) {
        this.lists = lists;
    }

    public Dog getDog() {
        return dog;
    }

    public void setDog(Dog dog) {
        this.dog = dog;
    }
}







package org.jsoft.bean;

public class Dog {

    private String name;
    private Integer age;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public Integer getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

还需要修改springboot的配置文件pom.xml

导入配置文件处理器,以后编写配置就有提示了

971c794885fa318ba7d7be09b26a39be675.jpg

 

用properties文件配置


# idea  properties配置文件utf-8
# persion
persion.last-name=张三
persion.age=18
persion.birth=2017/12/12
persion.boss=false
persion.maps.k1 = v1
persion.maps..k2 = 14
persion.lists=a,b,c
persion.dog.name = dog
persion.dog.age = 15

可能会出现中文乱码情况,解决办法如下:

173386815ebee1160ef6268e2648f07e035.jpg

另外一种获取值得方式

package org.jsoft.bean;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * 将配置文件中配置的每一个属性的值,映射到这个组件中
 * @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
 *      prefix = "persion"  配置文件中哪个下面的所有属性进行一一映射
 * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
 * @Component 把Persion放入到容器中
 * */

@Component
//@ConfigurationProperties(prefix = "persion")
public class Persion {
/**
 * <bean class ="Persion">
 *      <property name="lastName" value="字面量/${key }从环境变量、配置文件中获取值/#{SpEl}"></property>
 *  </bean>
 * */
    @Value("${persion.last-name}")
    private String lastName;
    @Value("#{11 * 2}")
    private Integer age;
    @Value("true")
    private Boolean boss;
    private Date birth;

4.@Value获取值和@ConfigurationProperties获取值比较

 @ConfigurationProperties@Value
功能            批量注入配置文件中的属性           一个个指定
松散绑定(松散语法)支持       不支持           
SpEL不支持支持
JSR303数据校验支持不支持
复杂类型封装支持不支持

JSR303数据校验

cdf4c7c29bbac2c0af19e6a643408e847b6.jpg

配置文件中yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,用@Value

package org.jsoft.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Value("${persion.last-name}")
    private  String name;

    @RequestMapping("/sayHello")
    public String sayHello(){
        return "Hello" + name;
    }
}

6584370cbc351d6810abf7571f1a6ec1dec.jpg

如果说,我们专门编写了一个JavaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

5.@PropertySource&@ImportResource

@PropertySource:加载指定的配置文件

 /**
     * 将配置文件中配置的每一个属性的值,映射到这个组件中
     * @ConfigurationProperties: 告诉SpringBoot将本类中的所有属性和配置文件中的相关配置进行绑定
     *      prefix = "persion"  配置文件中哪个下面的所有属性进行一一映射
     * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;
     * @Component 把Persion放入到容器中
     * @ConfigurationProperties(prefix = "persion") 默认从全局配置中获取值
     *
     *
     * */

    @PropertySource(value = {"classpath:persion.properties"})
    @Component
    @ConfigurationProperties(prefix = "persion")
    @Validated
    public class Persion {

        private String lastName;
        private Integer age;
        private Boolean boss;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
persion.last-name=李四
persion.age=18
persion.birth=2017/12/12
persion.boss=false
persion.maps.k1 = v1
persion.maps..k2 = 14
persion.lists=a,b,c
persion.dog.name = dog
persion.dog.age = 15

@ImportResource:导入spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在配置类上

a82dae724d89a770833d315e4f7ae2eb0a4.jpg

不来编写Spring的配置文件

<?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 = "org.jsoft.service.HelloService"></bean>
    
</beans>

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

1.配置类=========Spring配置文件

2.使用@Bean给容器中添加组件

package org.jsoft.config;

import org.jsoft.service.HelloService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Configuration指明当前类是一个配置类,就是来替代之前的Spring配置文件
 * 在配置文件中用<bean></bean>标签添加组件
 * */
@Configuration
public class MyAppConfig {

    //将方法的返回值添加到容器中,容器中这个组件默认的id就是方法名
    @Bean
    public HelloService helloService(){
        System.out.println("配置类@Bean给容器中添加组件了、、、");
        return new HelloService();
    }
}

6.配置文件占位符

1.随机数

random.value、{random.int}、${random.long}

random.int(10)、{random.int[1024,65536]}

2.占位符获取之前配置的值,如果没有可以使用:默认指定值

porperties的配置文件

c3675f93e191698e98b75e853f66a4c14a4.jpg

 

 

 

 

 

转载于:https://my.oschina.net/u/3669883/blog/2236859

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值