• 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中也是这样

     

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

  • 相关阅读:
    清除浮动float
    overflow属性
    轮播图的小圆圈鼠标移上去变样式
    大banner居中
    网站logo
    VS里面设置类似于#1或者#2之类的程序快捷输入
    优先级运算简单顺口溜
    对2的次幂求模
    VS2019离线安装
    unity ContentSizeFitter设置verticalFit立即生效
  • 原文地址:https://www.cnblogs.com/Joke-Jay/p/8992516.html
Copyright © 2020-2023  润新知