spring boot 学习笔记

spring boot 学习笔记

Spring 快捷键笔记:
    psvm  主方法的快捷键
    Ctrl+n打开自动搜索
    Alt + Insert 快捷生成 get set toString 等方法
@RestController 将controller的注解和resposeBody 注解结合起来 每个返回的数据都用json数据格式封装
@configuration//表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件

@EnableConfigurationProperties(HttpEncondingProperties.class) //启动指定类的功能ConfigurationProperties功能;将配置文件中对应的值和httpEncodingProperties绑定起来;
@ConfigurationProperties(prefix="spring.http.encoding")//从配置文件中获取指定的值和bean 属性进行绑定
@ConditionalOnWebApplication //Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果 满足指定的条件,整个配置类里面的配置就会生效;    判断当前应用是否是web应用,如果是,当前配置类生效 
@ConditionalOnClass(CharacterEncodingFilter.class)  //判断当前项目有没有这个类 CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing =  true)  //判断配置文件中是否存在某个配置  spring.http.encoding.enabled;如果不存在,判断也是成立的 //即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@Bean   //给容器中添加一个组件,这个组件的某些值需要从properties中获取
@ConditionalOnMissingBean(CharacterEncodingFilter.class) //判断容器没有这个组件

基于spring 3.0  简化spring 应用开发一个框架,
  可 Spring boot  javaEE 一站式的解决方案
      Spring cloud 分布式 整体解决方案;
    
  可以简化配置 Spring 配置 以及主流框架
  使用嵌入式的Servlet容器,应用无需打成WAR包
  starts自动依赖 与版本孔子
  大量的自动配置 简化开发,可以修改默认值
  无需配置xml文件,没有代码生成,开箱即用
  准生产环境的运行时应用监控
  与与计算的天然集成
 缺点:入门容易 ,精通难;
   微服务:架构风格,一个应用就是一组小型服务,可以通过HTTP 来访问 
   每一个功能元素 独立出来,元素动态 功能的复制 
  每一个功能元素都是可以独立替换,独立升级的软件的单元
  每一个功能元素都可以通过http通信  
  部署和运维很大的困难
 spring cloud 进行分布式管理

maven设置:
    maven 的setting  设置自己的jdk版本 
实现holle word 的基本运行
1.创建一个jar工程
2.导入spring  boot 的依赖
3.编写一个主程序  启动spring boot 
@SpringBootApplication 标记一个主程序 主配置类

 4.运行主程序
5.发布项目 
  创建一个可执行的jar包
spring maven 的项目中有父项目   管理依赖
以后导入jar 包 默认的依赖是不用写版本  版本仲裁
2.导入 依赖  spring boot  starter -web    spring boot 的帮我们导入了
web 模块 依赖,
starter  相关依赖的 启动器  在spring 官网  spring boot 将所有的功能场景导入
进来   版本由spring boot 父依赖管理

@SpringBootApplication 配置类将会扫描 该包和子包所有的组件都扫描进
spring 
@Import EnableAutoConfigurationImportSelector 导入哪些组件的选择器
将所有需要导入的组件以全类名的方式返回。这些组件就会被添加到容器中
会给容器导入非常多的自动配置类:就是给容器中导入这个场景需要的所有组件
并且配置好这些组件; 
 有了自动配置类就不用手动配置了;
     SpringFactoriesLoader.loadFactoryNames(EnableAutoConfigration.class,classLoader);
     spring boot 启动的时候从类路径下的META-INFspring.factories中获取EnableAutoConfiguration 指定的值
      将这些值自动配置类导入到容器中,自动配置类就生效,帮我们自动配置类,
      
     j2EE 整体的解决方案都自动配置进来了

@SpringBootConfiguration     ---spring boot 的一个配置类
@Configuration  配置类  类似配置文件  配置类也是容器中的一个组件
@EnableAutoConfiguration 开启自动配置
@AutoConfigurationPackage  自动配置包
@Import({Registrar.class})  spring的底层配置类 impor 给容器中
导入一个组件,导入的组件由AutoConfigurationPackage管理
  

以前的开发:  页面 和 后台都写入 一个war包中,开发部署简单, 水平扩展简单
   日益增长的软件需求  牵一发而动全身;


如何创建一个快速的spring boot 项目
  选择我们需要的模块,然后spring boot 会创建 并且导入模块
  默认的主程序已经生成   我们只需要完成自己逻辑
      默认生成一个生成一些 结构
      resource 文件夹中的目录结构
    1.static :保存所有的静态资源包括js css images;
    2.tempates:保存所有的模版页面 (Spring Boot 默认jar包使用
    嵌入式的Tomcat ,默认不支持jsp页面) 可以使用模版引擎(freemarker,thymeleaf)
    3.application.properties:Spring boot 应用配置文件,可以修改一些默认配置,比如在里面修改 tomcat 的访问端口号
    用代码进行修改 如 server.prot=8081;
  Spring boot 配置文件
     使用2中默认的配置文件 配置文件名字是固定的
    1.application.properties
    2.applicaion.yml 
   当properties 和 yml 配置文件中都修改了 tomcat 端口号,spring boot 中优先加载properties 中的配置文件

  配置文件的作用:修改spring boot 自动默认配置文,spring boot 在底层都给我们配置
    以前的配置文件都是xml 配置文件
    现在出现yml 以数据为中心 比json xml 更适合做配置文件
    出现新的语法格式
        比如:
            server:
                port:8081 
    以前的xml文档需要配置标签等一下 yml 更加的简洁    

2.YAML(yml基本语法)
    k:(空格) v:表示一对键值对(空格必须有)
    以空格的缩减来控制层级关系 ;只要左对齐的一列数据,都是同一个层级的数据
    server:
         port:801
         path:/hello
    属性和值大小写敏感
      值的写法   值和属性必须有空格
    普通的值 (数字,字符串,布尔)
        k: v:字变量直接写
    字符串默认不用 加上单引号 或者双引号
         "":双引号不会转义字符串里面的特殊字符  特殊字符作为本身想要表示的意思
              name:"zhangsan\n lisi" :输出 zhang san 换行 lisi 
          ' ':   单引号会转义字符  特殊字符最终只是一个普通的字符串数据
            name:"zhangsan\n lisi" :输出 zhang san \n lisi
    对象或者Map (属性和值)键值对
        k: v:  在下一行来写对象的属性和值的关系 注意缩进
           对象还是以k: v的方式 
            friends:
               lastname:zhangsna
               age:20;
        行内写法:
            friends :{lastName: zhansan,age: 21}
    数组的写法 用 -值来表示数组中一个的元素
        如
        pets:
           -dog
           -cat
           -pig
        行内写法:pets:[dog,cat,pig]
3.获取配置文件的值:
    在yml 文件中 写对象变量的值,通过spring boot 的导入,来获取配置文件的    
   yml 文件中编写:person:    
         lastName: hello
         age: 18  
                boss: false
                birth: 2017/12/12
                maps: {k1: v1,k2: 12}  
                lists:     
          ‐ lisi     
          ‐ zhaoliu   
                dog:    
           name: 小狗      
           age: 1
   javabean 中编写:
    /**  * 将配置文件中配置的每一个属性的值,映射到这个组件中  * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;  *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射  *  * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;  *  */
 @Component
 @ConfigurationProperties(prefix = "person")
 public class Person {     
  private String lastName; 
    private Integer age;   
  private Boolean boss;     
private Date birth;  
     private Map<String,Object> maps;
     private List<Object> lists;   
  private Dog dog;        

<!‐‐导入配置文件处理器,配置文件进行绑定就会有提示‐‐> 
<dependency>        
  <groupId>org.springframework.boot</groupId>    
          <artifactId>spring‐boot‐configuration‐processor</artifactId>           
   <optional>true</optional>          
</dependency>

properties 配置文件中 如果写 中文 可能出现 中文乱码问题
    在  Other Setting 配置即可  File Encoding 设置 utf-8 ASC码
  还可以用spring 原来的 注解 @Value("${person.last-name}"); 在定义的变量上
    person.last-name(实例  在properties 文件中编写数据)
    支持/${person.last-name} 字面量 从环境变量,配置文件中获取值/#{Spel}    

@configurationProperties获取值比较@Value  
1.批量注入配置文件的属性            只能一个一个配置
2.支持松散绑定 松散语法      不支持松散语法  (-后面的英文小写)
3.不支持Sqel 语法           支持
4.JSR303数据校验 注解(@validated)不支持
5.复杂类型封装支持                      不支持

       只是在某个业务逻辑中只是获配位文件中的某项值 只用@Value
       如果要从配置文件中加载 JavaBean 映射 配置文件中的值我们使用@configurationProperties
     
@configurationProperties  默认从全局配置文件中获取值
4.
@PropertySource(value="classpath:person.properties")//指定类加载配置文件的地址
@ImportResource(locations={"classpath:beans.xml",""}) :导入Spring 的配置文件,让配置文件里面的内容生效
  Spring boot 里面没有Spring 配置文件 我们自己配置spring 文件也不能自动识别
   需要用@ImportResource来加载到spring 配置文件    
1.配置类===Spring 配置文件
Spring boot 推荐给容器中添加组件的方式:全注解的方式实现
@Configuration :指明当前类是一个配置类,就是来替代之前的spring 配置文件
配置文件中用<bean></bean>添加标签组件
@Bean 替代  <bean></bean>标签  将方法的返回值 添加到容器中
  容器中这个组件的默认的id就是方法名


5.配置文件中的占位符 
   ${random.uuid} //配置文件中的语法  properties 和 yml 
   占位符的运用 :指定默认值  ${Person.hello:hello}

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

6.Profile 是Spring 对不同环境提供不同配置功能的支持,可以通过激活
指定参数等方式快速切换环境
    在主配置文件编写的时候,文件名可以是application-{profile}.properties/yml
    默认使用application.properties 的配置
        
    
激活指定profile 
1.在配置文件中指定spring.profiles.action=dev(dev就是 profile 取不一样的名字)

yml 中进行文档块 ---三个- 定义文档块 spring: profile: dev(定义文档块)
2.命令行的激活 
3.虚拟机参数 激活  -Dspring.profile.active=dev


spring boot 的配置文件的加载的优先级
   高优优先级覆盖低优先级
   当前目录的根目录  最高
   当前目录的config  目录;
   classpath:/config 目录
   classpath: ..目录
  spring boot 会全部加载4个目录的配置文件,这样加载可以进行互补配置;
 
项目打包好之后,使用命令行参数的形式,启动项目的时候来指定配置文件的新位置。  
----指定配置文件和默认的配置文件会都加载,形成互补配置 
----可以通过命令行:--spring.config.location来改变默认的配置文件位置
 
7:外部配置文件加载顺序:
    官方文档 提供17种
   spring boot 也可以从以下位置加载配置,优先级从高到低
    高优先级会覆盖低优先级,所有配置会形成互补配置
        (这里的优先级从高到低)
    1.命令行 --server.port=8087  所有的配置都可以在命令行上进行指定
        java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc 多个配置用空格分开; --配置项=值  
    2.来自java:comp/env的JNDI属性
    3.Java系统属性(System.getProperties())
    4.操作系统环境变量 
    5.RandomValuePropertySource配置的random.*属性值由jar包外向jar包内进行寻找; 

    优先加载带profile
    6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
    7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件  
    
    再来加载不带profile
    8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件 
    9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件    
    
    10.@Configuration注解类上的@PropertySource
     11.通过SpringApplication.setDefaultProperties指定的默认属性所有支持的配置加载来源;
     
第二十个视频 知识要点:
    1.配置文件到底写什么,怎么写。    自动配置原理
     配置文件能配置的属性参照
      @SpringBootAppaction 注释在主类上,开始spring boot的工程
       自动配置原理:
     1.spring boot 启动的时候加载主配置类,开启了自动的配置功能,@EnableAutoConfiguration
    2.@EnableAutoConfiguration 作用:
        -利用 EnableAutoConfigurationImportSelector给容器中导入了一些组件
        -可以插件selectImports()方法内容;
        -list<String > configurations=getCandldateConfigurations(annotatlonMetadate, attributes);获取候选的配置
        SpringFactoriesLoader.loadFactoryNames()
        扫描所有jar包类路径下  META-INF/spring.factoties
        把扫描到的这些文件的内容包装成properties对象;
        从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中
    将类路径下的 META-INF/spring.factories里面配置所有EnableAutoConfiguration的值加入到了容器中;
    
    每一这样的类 xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中,用他们来做自动配置;
    3.每一个自动配置类进行自动配置功能呢;
    4.以HttpEncodingAutoConfiguration 为例解释自动配置原理
    一但这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取 的,这些类里面的每一个属性又是和配置文件绑定的;
    
    5.所有在配置文件中能配置的属性都是在xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应这个属性类
    
    
    @ConfigurationProperties(prefix = "spring.http.encoding")  //从配置文件中获取指定的值和bean的属 性进行绑定
    public class HttpEncodingProperties{
    public static final Charset DEFAULT_CHARSET = Charset.forName("UTF‐8");
    }
    
    因此我们可以在 appliaction.properties 或者 appliaction.yml 配置文件中添加配置属性
    例如:spring.http.encoding.enabled=true
              spring.http.encoding.charset=utf-8
             spring.http.force=true
    
     //我们能配置的属性都是来源于这个功能的proprties类
Spring boot的精髓:    
    1.Spring Boot 启动会加载大量的自动配置类
    2.我们看我们需要的功能有没有Spring Boot 默认写好的自动配置累;
    3.我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件有,我们就不需要再来配置了)
    4.给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值;

    xxxAutoConfiguration:自动配置类
    给容器中添加组件
    xxxProperties:封装配置文件中相关属性;
    
        


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值