SpringBoot框架介绍

一、SpringBoot简介

Spring Boot 是由Pivotal 团队开发的Spring 框架,采用了生产就绪的观点,旨在简化配置,致力于快速开发

Spring Boot 框架提供了自动装配和起步依赖,使开发人员不需要配置各种xml 文件。通过这种方式,极大地提高了程序的开发速度,因此, Spring Boot 被认为是新一代的Web 开发框架;
在过去的Spring 开发中,需要引入大量的xml 文件;Spring 2.5 引入了包扫描,消除了显式的配置Bean;Spring 3.0 又引入了基于JavaBean 的配置,这种方式可以取代xml 文件;尽管如此,在实际的开发中还是需要配置xml 文件,例如配置SpringMVC 、事务管理器、过滤器、切面等;
在项目的开发过程中,会引入大量的第三方依赖,选择依赖是一件不容易的事,解决依赖与依赖之间的冲突也很耗费精力。所以,在以前的Spring 开发中,依赖管理也是一件棘手的事情;Pivotal 团队提供的Spring Boot 框架,解决了以前Spring 应用程序开发的痛点。

Spring Boot 的特点

对比之前的Spring, Spring Boot 有三大特点:自动配置、起步依赖和Actuator 对运行状态的监控

自动配置就是程序需要什么, Spring Boot 就会装配什么;例如, 当程序的pom 文件引入了Feign 的起步依赖, Spring Boot 就会在程序中自动引入默认的Feign 的配置Bean ;再例如配置Feign 的Decoder 时,如果开发人员配置了Decoder Bean, Spring Boot 就不会引入默认的Decoder Bean ;自动装配使得程序开发变得非常便捷、智能化。
在以前开发过程中,向项目添加依赖是一件非常有麻烦的事:选择版本,解决版本冲突,十分耗费精力。例如,程序需要Spring MVC 的功能,那么需要引入spring-core 、spring-web和spring-webmvc 等依赖,但是如果程序使用Spring Boot 的起步依赖,只需要加入spring-boot-starter-web 的依赖,它会自动引入SpringMVC 功能的相关依赖;
Spring Boot 能够提供自动装配和起步依赖, 解决了以前重量级的xml 配置和依赖管理的各种问题;一切都显得那么敏捷、智能,但是却带来了一系列的其他问题:

开发者该怎么知道应用程序中注入了哪些Bean ?

应用程序的运行状态是怎么样的?

为了解决这些问题, SpringBoot 提供了Actuator 组件,井提供了对程序的运行状态的监控功能。

SpringBoot 的优点

Spring Boot 不仅提供了自动装配、起步依赖,还自带了不少非功能性的特性,例如安全、度量、健康检查、内嵌Servlet 容器和外置配置;开发人员可以更加敏捷快速地开发Spring 程序, 专注于应用程序本身的业务开发,而不是在Spring 的配置上花费大量的精力。另外, Actuator 提供了运行时的Spring Boot 程序中的监控端点,让开发人员和运维人员实时了解程序的运行状况。

 

二、用IDEA构建SpringBoot工程

打开“ IDEA ”→“new Project "→“ Spring Initializr ”→填写“ group "和“ artifact ”→勾选“ web ”(开启web 功能) → 单击“下一步”,IDEA 会自动下载Spring Boot 工程的模板

spring boot ddd框架 springboot框架介绍_Spring

spring boot ddd框架 springboot框架介绍_Spring_02

创建完成后的项目目录为下图所示:

spring boot ddd框架 springboot框架介绍_spring_03

1)POM:依赖管理文件;

2)resources:资源文件夹;

3)static:静态资源;

4)templates:模板资源;

5)application.properties:配置文件;

6)HelloWorldApplication:程序启动类;

package com.example.helloworld;

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

@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }

}

其中,@ SpringBootApplication 注解包含了@SpringBootConfiguration 、@EnableAutoConfiguration和@ComponentScan , 开启了包扫描、配置和自动配置的功能。这是一个完整的、具有Web 功能的工程,为了展示Web 效果, 建一个Web 层的Controller,代码如下:

package com.example.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.*;

@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String index () {
            return "Greetings from Spring Boot !" ;
        }
    }
}

浏览器访问:http://localhost:8080/hello

spring boot ddd框架 springboot框架介绍_spring boot ddd框架_04

@RestController 注解表明这个类是一个RestConoller,@RestController 是Spring4.0版本的一个注解, 它的功能相当于@Controller 注解和@ResponseBody 注解之和,@RequestMapping 注解是配置请求地址的Url映射的。
启动HelloWorldApplication 的main方法,SpringBoot 程序启动。在控制台会打印启动的日志,程序的默认端口为8080 。
打开浏览器访问即可得到上图;
SpringBoot的神奇之处在于:在程序中没有做web.xml的配置,也没有做SpringMVC的配置,甚至都不用部署在Tomcat 上,就可以构建一个具备Web功能的工程。其实,SpringBoot自动为你做了这些配置,并且它默认内嵌了Tomcat容器。

 

三、SpringBoot配置文件详解

1、自定义属性

在用IDEA 创建一个Spring Boot工程时,系统默认会在src/main/java/resources 目录下创建一个配置文件application.properties;
它也支持yml 格式的文件,下面以yml格式的文件为例来讲解如何自定义属性,在工程的配置文件application.yml 自定义一组属性,如下:

my:
    name:hello
    age:18

如果要读取配置文件application.properties的属性值,只需在变量上加@Value("{属性名}")注
解,就可以将配置文件application.properties的一个属性值赋给一个变量:

package com.example.helloworld;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.*;

@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }
    @RestController
    public class HelloController {
        @RequestMapping("/hello")
        public String index () {
            return "Greetings from Spring Boot !" ;
        }

        @RestController
        public class NameAgeController {
            @Value("${name}")
            private String name;
            @Value("${age}")
            private int age;
            @RequestMapping(value = "/nameage")
            public String nameage() {
                return name + ":" + age;
            }
        }
    }

}

启动工程SpringBoot,打开浏览器访问http://localhost:8080/nameage,浏览器显示如下:

spring boot ddd框架 springboot框架介绍_spring boot ddd框架_05

2、将配置文件的属性赋给实体类

当有很多配置属性时 ,如果逐个地读取属性会非常麻烦。通常的做法会把这些属性名作为变量名来创建一个JavaBean 的变量,并将属性值赋给JavaBean 变量的值。在配置文件application.properties中添加如下属性:

my:
    name:hello
    age:18
    number:${random.int}
    uuid:${random.uuid}
    max:${random.int(10)}
    value:${random.value}
    gretting:hi,i am ${my.name}

其中,配置文件中用到了${random},它可以用来生成各种不同类型的随机值。random.int随机生成一个int类型的值,random.uuid 随机生成一个uuid, random.value 随机生成一个值,random.int(10)随机生成一个小于10 的整数。
怎么将这些属性赋给一个JavaBean 呢?创建一个JavaBean,其代码清单如下:

package com.example.bean;

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

/**
 * Created by fangzhipeng on 2017/4/18.
 */
@ConfigurationProperties(prefix = "my")
@Component
public class ConfigBean {

    private String name;
    private int age;
    private int number;
    private String uuid;
    private int max;
    private String value;
    private String greeting;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getUuid() {
        return uuid;
    }

    public void setUuid(String uuid) {
        this.uuid = uuid;
    }

    public int getMax() {
        return max;
    }

    public void setMax(int max) {
        this.max = max;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }
}

在上面的代码中,在ConfigBean 类上加一个注解@ConfigurationProperties表明该类为配置属性类,并加上配置的prefix,例如本案例的"my"。另外需要在ConfigBean 类上加@Component 注解, SpringBoot 在启动时通过包扫描将该类作为一个Bean 注入IoC 容器中。
创建一个Controller,读取ConfigBean 类的属性。在Controller 类上加@EnableConfigurationProperties注解并指明ConfigBean类,其代码清单如下:LucyController:

package com.example.web;

import com.example.bean.ConfigBean;
import com.example.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableConfigurationProperties({ConfigBean.class})
public class LucyController {
    @Autowired
    ConfigBean configBean;

    @RequestMapping(value = "/lucy")
    public String hello(){
        return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
    }

}

在浏览器上访问http://localhost:8080/lucy,浏览器会显示从配置文件读取的属性。

3、自定义配置文件

有时属性太多,把所有的配置属性都写到application.properties 配置文件中不太合适,这时需要自定义配置文件,例如在src/main/resources 目录下自定义一个test.properties 配置文件,其配置信息如下:

com.example.name=example
com.example.age=19

将这个配置文件test. properties 的属性和属性值赋给一个JavaBean 需要在类名上加@Configuration 、@Property Source 和@ConfigurationProperties 这3个注解。User.java

package com.example.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;


@Configuration
@PropertySource(value = "classpath:test.properties")
@ConfigurationProperties(prefix = "com.example")
public class User {
    private String name;
    private int age;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

写一个LucyController 的类,在类的上方加上@RestController 注解,开启RestControllerde的功能:加上@EnableConfigurationProperties 注解,并指明需要引用的JavaBean 的类,开启引用配置属性的功能, 其代码清单如下:LucyController.java

package com.example.web;

import com.example.bean.ConfigBean;
import com.example.bean.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@EnableConfigurationProperties({ConfigBean.class,User.class})
public class LucyController {
    @Autowired
    ConfigBean configBean;

    @RequestMapping(value = "/lucy")
    public String lucy(){
        return configBean.getGreeting()+" >>>>"+configBean.getName()+" >>>>"+ configBean.getUuid()+" >>>>"+configBean.getMax();
    }

    @Autowired
    User user;
    @RequestMapping(value = "/user")
    public String user(){
        return user.getName()+user.getAge();
    }

}

在浏览器上访问http://localhost:8080/user。浏览器会显示example:19这说明白定义配置文件的属性被读取到了JavaBean 中。

多个环境的配置文件

在实际的开发过程中,可能有多个不同环境的配置文件, 例如: 开发环境、测试环境、生产环境等。SpringBoot支持程序启动时在配置文件applicaition.properties中指定环境的配置文件,配置文件的格式为application-{profile} .properties ,其中{profile }对应环境标识,例如:

application-test.properties ————测试环境
application-dev.properties  ————开发环境
application-prod.properties ————生产环境

指定这个环境配置文件只需要在application.profiles中加上spring.profiles.active 的配置,该配置指定采用哪一个profiles,例如使用application-dev.properties,则配置代码如下:

my:
 name:hello
 age:18
 number:${random.int}
 uuid:${random.uuid}
 max:${random.int(10)}
 value:${random.value}
 gretting:hi,i am ${my.name}

spring:
  profiles:
    active: dev

application-dev.profiles的配置文件中指定程序的启动端口, 配置代码如下:

server:
  port: 8082

启动工程, 查看控制台打印的日志, 程序的启动端口为8082 , 而不是默认的8080, 这说明配置文件生效了

————————————————————————————————————————————