Fork me on GitHub
陌上&曦夏
欲以一身撼天下 须于平底起波澜

spring boot(一)入门

一、简介

1、微服务的概念

说起spring boot,我们不得不说一下“微服务”一词的兴起,微服务一词最早起源于2014年,martin fowler发表的一篇文章Microservices,martin fowler在文中这样描述了微服务的概念。

In short, the microservice architectural style [1] is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.

简而言之,微服务就是一种架构风格,即服务微化,一个服务应该是一组小型服务;服务之间通过HTTP的方式进行互通,相较于传统的ALL IN ONE单体架构方式,微服务将每一个功能元素最终都是一个可独立替换和独立升级的软件单元。

2、什么是spring boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者 ——百度百科

众所周知,最流行的、最受Java开发者喜好的框架当属Spring,Spring也成为了在Java EE开发中真正意义上的标准,但是随着新技术的发展随着新技术的发展,在这个脚本语言大行其道的时代(Node JS,Ruby,Groovy,Scala等),Java EE使用Spring逐渐变得笨重起来,大量的XML文件存在于项目中,繁琐的整合配置,复杂的监控,低下的开发效率和部署效率等等问题。spring boot的出现解决了上述的问题,让我们更加高效快速的使用spring框架。

  1. 习惯优于配置的原则,默认的配置已经满足我们日常开发的大部分要求。
  2. 快速搭建组合各个模块功能的提供,无需配置的整合第三方框架。
  3. 零XML配置,只需要自动配置和Java Config。
  4. 内嵌Servlet容器,降低环境的要求,更快更多方式的启动项目的方式。
  5. 更便捷的应用状态监控。
  6. 与云计算spring cloud组成J2EE一站式解决方案。

3、快速入门

3.1 环境及工具

  • jdk1.8:Spring Boot 推荐jdk1.7及以上;我们使用java version "1.8.0_152"。
  • 目前最新的springboot,spring boot 2.1.0 BUILD-SNAPSHAT 要求Java 8 or 9Spring Framework 5.1.0.BUILD-SNAPSHOT 以上。
  • IntelliJIDEA2018:我使用的是 IntelliJ IDEA 2018.1.3 x64、STS。
  • SpringBoot : 使用1.5.10.RELEASE。

3.2 Maven设置

给maven 的settings.xml配置文件的profiles标签添加指定jdk版本

<profile>
  <id>jdk‐1.8</id>
  <activation>
    <activeByDefault>true</activeByDefault>
    <jdk>1.8</jdk>
  </activation>
  <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
  </properties>
</profile>

3.3 IDEA设置

3.4 Hello World

创建一个maven工程(jar工程)

pom.xml中导入spring boot的依赖,根据官方文档的快速开始,引入一下依赖:

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

	<!-- Additional lines to be added here... -->

	<!-- (you don't need this if you are using a .RELEASE version) -->
	<repositories>
		<repository>
			<id>spring-snapshots</id>
			<url>https://repo.spring.io/snapshot</url>
			<snapshots><enabled>true</enabled></snapshots>
		</repository>
		<repository>
			<id>spring-milestones</id>
			<url>https://repo.spring.io/milestone</url>
		</repository>
	</repositories>
	<pluginRepositories>
		<pluginRepository>
			<id>spring-snapshots</id>
			<url>https://repo.spring.io/snapshot</url>
		</pluginRepository>
		<pluginRepository>
			<id>spring-milestones</id>
			<url>https://repo.spring.io/milestone</url>
		</pluginRepository>
	</pluginRepositories>

Spring Boot提供了许多“Starters”,可以将jar添加到类路径中,spring-boot-starter-parent是一个特殊的启动器,提供有用的Maven默认值,其他“Starters”提供了在开发特定类型的应用程序时可能需要的依赖项。由于我们正在开发Web应用程序,因此我们添加了 spring-boot-starter-web依赖项。在此之前,我们可以通过运行以下命令来查看当前的内容

$ mvn dependency:tree 

[INFO] com.example:myproject:jar:0.0.1-SNAPSHOT

也可以在idea中 使用ctrl+alt+shift+u 查看依赖图如下:

可以看到它spring-boot-starter-parent本身不提供依赖关系。要添加必要的依赖项,请编辑pom.xmlspring-boot-starter-web在该parent部分的正下方添加 依赖项:

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

再次查看依赖图:如下

3.5 编写主程序启动应用

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

/**
 * @program: springboot-01-HelloWorrld
 *
 * @description: springboot主程序类
 *
 * @author: cxw
 *
 * @create: 2018-09-07 14:34
 **/
 //springmvc的注解,提供web服务,接收浏览器请求并,向浏览器响应等同 @controller和@responseBody注解
@RestController
@EnableAutoConfiguration
public class Application {

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

  1. @RestController@requestmapping注解是Spring MVC注解。(它们不是特定于Spring引导的。)有关更多细节, 请参阅Spring参考文档中的MVC部分。
  2. 第二个注解@EnableAutoConfiguration,这个注解告诉springboot,让它猜测你想基于你添加的jar依赖去如何配置spring,由于Spring boot-starer-web添加了Tomcat和Spring MVC,所以自动配置会假设您正在开发一个web应用程序并帮您相应地设置Spring。
  3. 应用程序的最后一部分是main方法。这只是一个标准的方法,它遵循Java约定的应用程序入口点。我们的main方法通过调用run来委托Spring Boot的SpringApplication类。SpringApplication引导我们的应用程序,启动Spring,然后启动自动配置的Tomcat web服务器。我们需要Application类作为运行方法的一个参数,用来告诉SpringApplication,它是主要的Spring组件。args数组命令行参数也作为参数传递给SpringApplication。

3.6 编写controller响应浏览器请求

 	/**
   	  * home方法 向浏览器响应 Hello World
   	  */
    @RequestMapping("/hello")
    public String home(){
        return "Hello World";
    }

3.7 运行main方法,启动程序

浏览器访问localhost:8080/hello

可以看到,我们第一个spring boot项目已经启动了。另外我们看到,这里Applicationjava被配置为自动配置的控制器,而且对于@EnableAutoConfiguration注解我们使用不熟悉,很容易忘记在控制层添加注解,其实spring boot 是可以使用一个主程序启动spring bot项目,然后我们按照我们传统的controller,service,dao三层编写我们的程序,我们改进一下项目如下:

  1. 首先springboot的主程序入口:

    //@SpringBootApplication 来标注一个主程序类,
    //说明这是一个Spring Boot应用
    @SpringBootApplication 
    public class Application {
      public static void main(String[] args) {
          SpringApplication.run(Application.class, args);
      }
    }
    
    
    1. 我们定义两个Controller控制层HelloController和HomeController,按照springmvc的方式,接收请求,返回响应。

      package cn.news.chen.controller;/**
       * Project springboot-01-HelloWorrld
       * User cxw
       * Date 2018/9/7
       * Time 16:08
       * Description:
       */
      
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.RequestMapping;
      import org.springframework.web.bind.annotation.ResponseBody;
      
      /**
       * @program: springboot-01-HelloWorrld
       *
       * @description: springboot控制层
       *
       * @author: cxw
       *
       * @create: 2018-09-07 16:08
       **/
      @Controller
      @RequestMapping("/a")
      public class HomeController {
          @RequestMapping("/b")
          @ResponseBody
          public String hello(){
              return "这是我的第一个spring boot应用";
          }
      }
      
      
      1. 启动访问:

    HelloController.java

    package cn.news.chen.controller;/**
     * Project springboot-01-HelloWorrld
     * User cxw
     * Date 2018/9/7
     * Time 16:39
     * Description:
     */
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    /**
     * @program: springboot-01-HelloWorrld
     *
     * @description: 控制层HelloController
     *
     * @author: cxw
     *
     * @create: 2018-09-07 16:39
     **/
    //@RestController和这个注解都是类级别的,使用@RestController说明该类下的所有方法都是向浏览器
    //响应
    @Controller 
    public class HelloController {
        /**
         * home方法 向浏览器响应 Hello World
         */
        @RequestMapping("/hello")
        @ResponseBody
        public String home(){
            return "Hello World";
        }
    }
    
    

    启动访问:

  注意:如果按照`@SpringBootApplication`主程序的方式使用springboot,类Application.java 要在需要控制的springboot 组件的顶级包或者同一级的包下,才能使用主程序类启动spring boot程序,springboot建议的目录结构如下:
 
  com
    +- myproject
      +- demo
        +- Application.java
        |
        +- domain
        |  +- User.java
        |  +- UserRepository.java
        |
        +- service
        |  +- UserService.java
        |
        +- controller
        |  +- UserController.java
        |

  1、Application.java 建议放到根目录下面,主要用于做一些框架配置。

  2、domain目录主要用于实体(Entity)与数据访问层(Repository)。

  3、service 层主要是业务逻辑层。

  4、controller 负责页面访问控制。

4.springboot的快捷部署

首先,我们要在pom.xml文件中添加spring boot的打包(jar)插件,官网文档中,给我们指出了使用的依赖,如图:

pom.xml添加如下内容:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

然后,我们使用maven将我们的spring boot项目打包

可以看到在我们项目的target目录下,已经打包成功了。我们使用jar包启动的方式,启动一下我们的springboot项目。

使用java -jar 的方式依然可以启动我们的springboot项目,并且可以正常访问,由此可以看到我们的springboot 使用嵌入式的Servlet容器,应用无需打成WAR包, starters自动依赖与版本控制,大量的自动配置,简化开发,真正做到了 J2EE一站式解决方案。

posted on 2018-09-07 17:44  陌上&曦夏  阅读(169)  评论(0)    收藏  举报