SpringBoot01-HelloWorld案例及分析

一、Spring Boot简介

什么是spring boot:

简化spring应用开发的一个框架;

整个spring技术栈的一个大集合;

j2ee开发的集合栈。

优点:

  • 快速创建独立运行的Spring项目以及主流框架集成
  • 拥有starters进行依赖的导入和对依赖的版本进行控制
  • 大量的自动配置,简化开发,也可修改默认值
  • 无需配置xml,也不用通过代码生成配置xml,开箱即用

2、微服务

什么是微服务:

微服务是一种架构风格,强调一个应用也应该是一组小型服务的集合,可以通过http的方式进行互通

二、HelloWorld

功能:

浏览器发送hello请求,服务器接受请求并处理,响应HelloWorld字符串。

步骤:

  1. 创建maven工程
  2. 导入springboot相关依赖
  <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>1.5.9.RELEASEversion>
    parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>
  1. 编写一个主程序,启动springboot
package com.bread;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/*添加注解告诉springboot这是一个springboot应用,来标注一个主程序类*/
@SpringBootApplication
public class HelloWorldMainApplication {
    public static void main(String[] args) {
        /*启动spring应用*/
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}
  1. 编写相关的Controller和Service
package com.bread.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/*标记controller*/
@Controller
public class HelloController {
     

    @ResponseBody
    @RequestMapping("/hello")
    public String hello(){
     
        return "Hello World!";
    }
}
  1. 直接运行HelloWorldMainApplication,打开浏览器访问页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaWA2kTk-1600929776961)(C:\Users\悲伤的面包\AppData\Roaming\Typora\typora-user-images\image-20200804143322186.png)]

成功显示!

不用再像springmvc一样配置视图解析器、扫描包等

  1. 在pom.xml中添加配置

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-maven-pluginartifactId>
        plugin>
    plugins>
build>
  1. 可以直接在idea右侧的maven中点击lifeCycle的package生成jar包,在左侧项目栏的target文件夹中找到打好的jar包,即可实现双击jar包打开项目(无需安装tomcat环境)

三、Hello World 探究

  1. pom.xml配置文件

<parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>1.5.9.RELEASEversion>
parent>

springBoot的版本管理中心,依赖于另一个parent元素,定义了许多maven坐标的版本,使得我们不用手动定义依赖的版本

<dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
dependencies>

spring-boot-starter:springboot场景启动器

springboot将所有常用的功能场景都抽取了出来做成了一个个独立的启动器(starter),只需要在项目里引入starter,相关的所有依赖就会随之被导入。

  1. 主程序类

/*添加注解告诉springboot这是一个springboot应用,来标注一个主程序类*/
@SpringBootApplication
public class HelloWorldMainApplication {
     
    public static void main(String[] args) {
     
        /*启动spring应用*/
        SpringApplication.run(HelloWorldMainApplication.class,args);
    }
}

@SpringBootApplication注解用来标注springboot应用的主配置类,springboot应该运行这个类的main方法开启应用。

@SpringBootApplication类中又包含了几个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
    excludeFilters = {
     @Filter(
    type = FilterType.CUSTOM,
    classes = {
     TypeExcludeFilter.class}
), @Filter(
    type = FilterType.CUSTOM,
    classes = {
     AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
     

**@SpringBootConfiguration:**标注在类上,表示这是一个springboot的配置类(替代配置文件)。效果跟@Configuration相同,不过前者由springboot定义,后者由spring定义。

@EnableAutoConfiguration:开启自动配置功能。

在EnableAutoConfiguration类中:

@AutoConfigurationPackage
@Import({
     EnableAutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
     

@AutoConfigurationPackage:自动配置包

在AutoConfigurationPackage类中:

@Import({Registrar.class})

@import为spring的底层注解,用于给容器中导入一个组件。

Registrar类:

@Order(-2147483648)
    static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
     
        Registrar() {
     
        }

        public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
     
            AutoConfigurationPackages.register(registry, (new AutoConfigurationPackages.PackageImport(metadata)).getPackageName());
        }

        public Set<Object> determineImports(AnnotationMetadata metadata) {
     
            return Collections.singleton(new AutoConfigurationPackages.PackageImport(metadata));
        }
    }

作用是将主配置类所在包及下面的所有子包里面的所有组件扫描到spring容器中

J2EE的整体自动配置都在autoconfig包下

IDEA快速创建springboot项目

new project — spring initializr — 填写信息 — 选择starters — 完成

resources目录结构:

  • static:存储静态资源

  • templates:保存所有的模板页面

  • application.properties:全局配置文件,用于修改默认配置

springBoot配置:

springboot会使用两种全局配置文件:

  • application.properties

  • application.yml

配置文件作用:修改springboot自动配置的默认值

yml是YAML语言文件,以数据为中心,比json、xml更适合做配置文件

YAML语法:

  1. 基本语法:

    • k: y:表示一对键值对,key和value之间有空格,用缩进来表示层级关系

      server:
      	port: 8081
      	path: /hello
      
  2. 输入字面量时(数字、字符串、布尔值、日期):

    默认不使用引号

    有转义字符参与时有两种情况:

    name: zhangsan \n lisi — zhangsan 换行 lisi

    name: zhangsan \n lisi — zhangsan \n lisi

    用双引号时,其中的特殊字符不会被转义输出

  3. 表示一个对象时:

    • 分行写法

      friends:
      	lastName: zhangsan
      	age: 20
      
    • 行内写法

      friends: {
               lastName: zhangsan,age: 20}
      
  4. 输入数组时:

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

    • 分行写法

      pets: 
       - cat
       - dog
      
    • 行内写法

      pets: [cat,dog,pig]
      
  5. 输入map时:

    • 分行写法:
    maps:
    	qq: 123
    	wechat: 456
    
    • 行内写法:
    maps: {
           k1: v1,k2: v2}
    

简单通过配置文件映射实体类属性值:

在pom.xml中添加支持:

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-configuration-processorartifactId>
    <optional>trueoptional>
dependency>

实体类:

/*
* @ConfigurationProperties将本类中的属性与配置文件中的相关属性进行绑定
* prefix = "person" 指定绑定的是配置文件中的哪些属性
* */
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
     
    private String name;
    private Integer age;
    private Map<String,Integer> counts;
    
    getter...
    setter...
    ...
}

配置文件:

person:
  name: zhangsan
  age: 23
  counts:
    qq: 123
    wechat: 456

Spring自带测试类:

@SpringBootTest
class Springboot01HelloworldQuickApplicationTests {
     

    @Autowired
    Person person;

    @Test
    void contextLoads() {
     
        System.out.println(person);
    }

}

输出:

Person{name='zhangsan', age=23, counts={qq=123, wechat=456}}

如果只是需要获取配置文件中的某个值,使用@Value

如果专门编写了一个javaBean来与配置文件进行映射,使用@ConfigurationProperties

**@ImportResource:**导入spring配置文件

标注在配置类上

@ImportResource(locations = {
     "classpath:beans.xml"})

但springboot推荐用编写配置类的方式:

详细介绍看"Spring注解驱动开发"笔记“配置类替代配置文件”部分

配置文件占位符:

随机数:${random.int}

获取配置文件中其他属性:${person.name}

${person.name:xiaoming}(默认值为xiaoming)

Profile

profile是spring对不同环境提供不同配置功能的支持(开发时用开发环境,测试时用测试环境等等),可以通过激活、指定参数等方式快速切换环境。

创建不同环境下对应的profile配置文件(使用properties类型配置文件时):

格式:application-{profile}.properties

application-dev.properties
application-prod.properties

激活配置文件:

  1. 在配置文件中指定spring.profiles.active={profile}

  2. 虚拟机参数激活:idea中在右上角run窗口中点击edit,修改VM options,添加

    -Dspring.profiles.active={profile}

  3. 命令行激活:运行打好的jar包时在最后添加(空格)–spring.profiles.active={profile}或在run窗口中的Program Argument参数中添加

优先级:命令行>虚拟机>配置文件

yml文档块格式:

以yml作为配置文件时操作更为简单,我们可以使用多文档块格式

server:
  port: 8082
spring:
  profiles:
    active:
      dev

---
server:
  port: 8083
spring:
  profiles: dev

---
server:
  port: 8084
spring:
  profiles: prod
  

配置文件优先级:

  • file:./config/(项目下的第一级config文件夹)
  • file:./
  • classpath:/config/
  • classpath:/

优先级由高到低,高优先级的配置会覆盖低优先级的配置,达到互补配置的效果

指定配置文件:

使用命令行运行jar包时,在最后加上

(空格)–spring.config.Location=D:/applition.properties

自动配置:

自动配置细节:

  1. @Conditional派生注解

    作用:符合注解标注的条件后才给容器中添加组件,配置类中的内容才会生效

    @Conditional派生注解 作用(判断是否满足当前指定条件)
    @ConditionalOnJava 系统的java版本是否符合要求
    @ConditionalOnBean 容器中存在指定bean
    @ConditionalOnMissingBean 容器中不存在指定bean
  2. 检查自动配置生效情况

    在配置文件中添加:

    debug=true
    

    进入springboot debug模式,在控制台打印的Auto-Configuration report部分查看自动配置生效情况

你可能感兴趣的:(SpringBoot,java,spring,spring,boot)