SpringBoot

SpringBoot出现的原因:

现在行业之中,spring已经作为了绝对的java架构,但进行快速开发时,往往先面临着大量的xml文件的配置,需要编写大量的xml文件

所以在这个大的历史背景下,很多人开始寻求更加简便的开发,而遗憾的是这种简便的开发没有被JDK所支持、没有被JavaEE所支持,

因为这些只是平台,平台能够提供的只是最原始的技术支持。

此时,SpringBoot出现了,改变了所有java开发所面临的困境。

SpringBoot最终奉行的宗旨(不太可能实现):废除掉所有复杂的开发,废除掉所有的配置文件,让开发变的更简单纯粹  核心:零配置

另外:SpringBoot之所以流行,是因为在SpringBoot中使用的注解还是之前Spring所提供的注解,这一点让所有的开发者几乎可以零适应进行完整过渡

官网:https://spring.io/

-----------------------------------------

SpringBoot官方快速启动程序

第一步:创建maven工程

第二步:在pom文件中引入官方的父工程

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

第三步:在pom文件中加入官方的依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

第四步:复制官网代码

运行:

或者通过maven运行

然后直接访问即可:http://localhost:8080

 

 如果想要进行SpringBoot开发,一定要使用maven或者其他的项目管理工具完成。

-------------------------------------

以上的程序,只是根据官方文档实现的一个基础程序模型,但是这样的代码肯定不适合我们实际的项目开发,因为从实际的maven项目来讲,应该要有统一的父pom.xml文件,但是官方文档中已经提供了一个父pom.xml(一个pom文件中只能有一个parent节点)

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

另外,我们使用maven管理工具进行开发时,推荐在pom.xml中指定的jdk版本  而不是使用系统自带的版本

所以下面我们对项目重新做一个规划

--------------------------------------

统一父pom管理

建立一个maven的父pom  类型为pom

{

新建一个microBoot的Maven项目

打开pom文件,修改

在pom添加<dependencyManagement>节点

删除该项目下所有的不相关文件

只留下pom.xml文件

}

目前为止这个项目不是SpringBoot所支持的项目,所以需要在pom文件中加入SpringBoot相关依赖包

在maven仓库中搜索

pom文件变为如下(单元测试可以删掉):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>cn.qqkj</groupId>
  <artifactId>microboot</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>microboot</name>
  <url>http://maven.apache.org</url>

  <properties>
    <!-- 管理jdk版本 -->
      <jdk.version>1.8</jdk.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

    <dependencyManagement>
      <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>1.5.4.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>

    <!--     <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>3.8.1</version>
          <scope>test</scope>
        </dependency> -->
      </dependencies>
   </dependencyManagement>
    <modules>
        <module>microboot-base</module>
    </modules>
     <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>${jdk.version}</source>
                    <target>${jdk.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build> 
</project>

建立microboot的子模块microboot-base 实现之前同样的操作

 

选择父模块

创建完成,打开子模块的pom.xml   可以看到有一个父模块节点  我们只需添加Web启动依赖即可,其他无关的内容注释掉。

<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>cn.qqkj</groupId>
    <artifactId>microboot</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
<!--   <groupId>cn.qqkj</groupId> -->
  <artifactId>microboot-base</artifactId>
<!--   <version>0.0.1-SNAPSHOT</version> -->
  <name>microboot-base</name>
  <url>http://maven.apache.org</url>
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
  <dependencies>
      <!-- 添加官网的Web启动包 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
<!--     <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency> -->
  </dependencies>
</project>

同样的和之前的一样,在子模块中,我们复制官网上的代码类,直接运行即可。

在父工程中:

此时子工程里边:

报错:

所以没有注释掉的两行代码是不行的,取消注释,我们就可以看到不再把报错了

但是仍然有警告

这个警告意思是:版本冲突,意思就是父工程中已经存在单元测试的版本了,子工程中也有,所以就产生了冲突,但是不解决也没有关系,maven自己也会解决

写到这我们就需要明白    父工程:担负起锁定相应的程序版本重任  所有依赖包的版本统一(SpringBoot解决的一个问题)

所有的版本控制我们只需要在父工程中写出即可,子模块中无需关心这些问题

 

这个dependency是包含很多的jar依赖的,artifactId点击去我们可以看到

-------------------------------------------

在快速启动案例中以及提到过,我们有两种方式可以启动程序

1.直接java application进行启动,没错  可以启动成功

2.通过maven来启动  spring-boot:run  这个时候  就发生了错误

解决办法:

    <!-- 统一 父pom方式:通过maven启动程序时 需要配置下面的信息 -->
     <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

可以在子模块中配置  也可以在父pom中进行配置  推荐在父pom中 因为可能有多个子模块  所以在父pom中配置一次即可  同时这个插件在项目打包部署的时候也要用到  下面会介绍

---------------------------------------------------

SpringBoot标准单元测试

导入依赖(注意因为我们配置了父pom  所以配置依赖的时候 不需要在指定版本了  父pom中都有对应的依赖)

    <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <!-- 不需要指定版本了 因为在父pom中已经指定  如果用的话 直接拿来用 -->
       <!--  <version>1.5.9.RELEASE</version> -->
        <scope>test</scope>
    </dependency>
    
    <!-- https://mvnrepository.com/artifact/junit/junit -->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <!--  <version>4.12</version> -->
        <scope>test</scope>
    </dependency>

被测试类:

package cn.qqkj.microboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@EnableAutoConfiguration
public class SampleController {

    @RequestMapping("/")
    @ResponseBody
    public String home() {
        return "Hello World!";
    }

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

创建测试类

package cn.qqkj.microboot.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

import cn.qqkj.microboot.SampleController;
import junit.framework.TestCase;

//标准的springboot测试程序
@SpringBootTest(classes=SampleController.class)//指定测试的类
@RunWith(SpringJUnit4ClassRunner.class)//测试类型
@WebAppConfiguration//web程序  按照web运行的模式进行测试
public class TestSampleController {
    //注入
    @Autowired
    private SampleController sampleController;
    
    //测试案例中的home方法
    @Test
    public void testHome() {
        TestCase.assertEquals(this.sampleController.home(),"Hello World!");
    }
    
}    

执行测试即可

---------------------------------

 SpringBoot启动注解分析

修改程序

主类:

新建控制器类HelloController(注意我们将该类放在主类所在包的子包中)

此时启动主类  我们继续访问http:localhost:8080/   启动成功  但是访问如下:

为什么不能访问,因为没有配置扫描

在次启动主类  我们访问http:localhost:8080/   启动成功  访问成功:

但是以上程序,SpringBoot给我们做了一个处理,提出了一个更简化策略,该策略核心思想:既然程序主类会在所有开发包的父包里边,那么提供一个特殊的复合注解,扫描的就是该主程序类下的所有子包

@SpringBootApplication等价于(@EnableAutoConfiguration+@ComponentScan("")+其他配置)  前提访问的类一定要在主类所在类的子包中

同样我们可以访问成功 

打开该注解的源代码:

如果满足不了上边说的前提,那么就需要指定扫描的路径

因为该复合注解只会扫描主类下的子包。

 所以在SpringBoot的开发里,一定要注意一个关键性的问题:子包     它的一切配置的操作,几乎都是以子包为主---

 -------------------------------------

 路径访问控制

在进行控制器编写的时候,有两种配置
1.跳转配置
2.restful显示
@ResponseBody:将控制器中的方法的返回值变为rest
没有该注解,表示跳转
加了该注解,就是rest结构

如下程序:

@Controller
public class HelloController {
    
    @RequestMapping("/")
    @ResponseBody
    public String home() {
        return "Hello World!";
    }
}

启动主类,localhost:8080 可以访问成功

下边我们把@ResponseBody注解删除  再进行测试

@Controller
public class HelloController {
    
    @RequestMapping("/")
    public String home() {
        return "Hello World!";
    }
}

启动没有问题,但是访问localhost:8080

此时因为没有@responseBody注解,它把方法的返回值当做了一个页面进行处理,即访问 Hello World! 页面 因为没有该页面,所以404

-----------------------

@RestController复合注解

项目里边可能控制器之中返回的全部都是restful信息,这样分别定义就太麻烦了
为此在SpringBoot中提供了一个复合注解@RestController
如果该控制器下的方法全部都为rest操作,那么使用该注解就非常方便了
但是并不表示在开发中都使用@RestController 从MVC的实际标准来讲 控制器需要传递一些属性到页面上进行显示,按照这样的原则并不是所有的开发都会以restful结构返回(但是Rest结构是SpringCloud的实现核心技术

@RestController
public class HelloController {
    
    @RequestMapping("/")
    //@ResponseBody
    public String home() {
        return "Hello World";
    }
}

------------------------

参数接受处理

 1.传递参数到控制器中最简单的做法是使用地址重写传递“xx?参数名称=内容”

@RestController
public class HelloController {
    
    @RequestMapping("/")
    //@ResponseBody
    public String home() {
        return "Hello World";
    }
    
    //访问: localhost:8080/echo?msg=你好
    @RequestMapping("/echo")
    public String echo(String msg) {
        return "【执行echo】"+msg;
    }
}

2. 由于SpringBoot支持Rest风格处理,所以此时对于参数的接受可以采用路径参数的形式完成

@RestController
public class HelloController {
    
    @RequestMapping("/")
    //@ResponseBody
    public String home() {
        return "Hello World";
    }
    
    //访问: localhost:8080/echo?msg=你好
    @RequestMapping("/echo")
    public String echo(String msg) {
        return "【执行echo】"+msg;
    }
    
    //访问:localhost:8080/echo2/xxxx
    @RequestMapping("/echo2/{a}")
  //@RequestMapping(value="/echo2/{a}",method=RequestMethod.GET)
public String echo2(@PathVariable("a")String msg) { return "【执行echo】"+
msg; } }

 

-------------------------------

自动加载配置的依赖(避免反复的启动程序)

项目的开发中,修改代码之后,如果想使代码生效,必须重新启动
springboot的处理操作之中考虑到了这种情况

两个依赖库:

<!-- https://mvnrepository.com/artifact/org.springframework/springloaded -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>springloaded</artifactId>
    <version>1.2.8.RELEASE</version>
    <scope>provided</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <version>2.0.1.RELEASE</version>
</dependency>

-------------------------------

 使用内置对象

通过整个SpringBoot程序可以发现,在SpringBoot中的控制器的形式和springmvc是一样的,如果现在要想在你的程序中去使用JSP的内置对象,那么也可以按照与SpringMVC同样的方式进行。

--------------------

项目的打包部署
传统的ssm或者ssh项目,我们部署到服务器上的时候,都是打包成war  然后放在服务器中的tomcat-webapp中 然后启功服务 运行即可
SpringBoot作为微架构实现的主要技术(微架构:一个程序打成jar包之后,轻松在所有地方都能执行),其发布项目的方式极为简单,只需要在项目中配置好插件,以及打包 然后就可以执行了 这个执行不需要特别复杂的配置
1.microboot项目:修改pom.xml配置文件,追加新的插件 这个插件我在上面已经使用过了  主要就是解决maven启动项目报错的问题  同时发布项目也需要这个插件

        <!-- 统一 父pom方式:通过maven启动程序时 需要配置下面的信息 -->
            <!-- 另外:该插件的主要功能是进行项目的打包发布处理 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 设置程序执行的主类 -->
                    <mainClass>cn.qqkj.microboot.StartSpringBoot</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

2.microboot-base模块:将当前项目模块进行打包处理:clean package;

此时将形成“microboot.jar”文件(target目录中),并且这个文件里边包含有全部的依赖支持库文件

3.怎么执行呢?在microboot.jar随便拷贝到一个地方 例如d:

进入命令行 java -jar microboot.jar 可以看到项目启动成功

然后该怎么访问就怎么访问 在浏览器输入地址就可以访问 同样在linux中也是这样

 

-------------------------------

原文地址:https://www.cnblogs.com/Joke-Jay/p/8992516.html