SpringBoot1.x 入门

文章源码

简介

传统的 JavaEE 开发,十分笨重且配置繁琐,开发效率很低,而且有很复杂的部署流程,对于第三方技术的集成也很困难。

Sring 全家桶时代则解决了上面的问题,而 SpringBoot 则是 JavaEE 一站式解决方案,SpringCloud 是分布式整体解决方案。

SpringBoot 可以简化 Spring 应用开发,遵循约定大于配置的原则,去繁从简。

SpringBoot 的优点

  • 快速创建独立运行的 Spring 项目以及与主流框架集成
  • 使用嵌入式的 Servlet 容器,应用无需打成WAR包
  • starters 自动依赖与版本控制
  • 大量的自动配置,简化开发,也可修改默认值
  • 无需配置 XML,无代码生成,开箱即用
  • 准生产环境的运行时应用监控
  • 与云计算的天然集成

微服务介绍

传统的单体应用:

  • 一个单体应用把所有的功能都放在一个单一进程中
  • 通过在多个服务器上复制这些单体进行扩展
  • 开发、测试、部署和升级等较为繁琐

微服务应用:

  • 微服务是一种架构风格
  • 一个微服务架构把每个功能元素放进一个独立的服务中,可以通过 HTTP 等方式进行互通
  • 通过跨服务器分发这些服务进行扩展,只在需要时才复制
  • 每一个功能元素最终都是一个可独立替换和独立升级的软件单元

HelloWorld

传统方式创建

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

实现步骤

  • 创建一个 Maven 工程

  • 引入 SpringBoot 相关依赖

        <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.22.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    </dependencies>
  • 创建主程序

    package cn.parzulpan.helloworld;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication; /**
    * @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
    */ @SpringBootApplication
    public class HelloworldApplication { public static void main(String[] args) {
    // Spring应用启动起来
    SpringApplication.run(HelloworldApplication.class, args);
    } }
  • 编写相关的 Controller、Service

    package cn.parzulpan.helloworld.cotroller;
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.ResponseBody;
    import org.springframework.web.bind.annotation.RestController; /**
    * @Author : parzulpan
    * @Time : 2020-12
    * @Desc :
    */ // 由于方法都是 Restful 风格,还可以直接用在类上
    //@ResponseBody
    //@Controller
    // RestController 更加简单
    @RestController
    public class HelloController { // ResponseBody 将这个方法返回的数据直接写给浏览器,如果是对象还可以直接转为 json 数据
    // @ResponseBody
    @RequestMapping("/hello")
    public String hello() {
    return "hello world!";
    }
    }
  • 运行主程序即可

  • 或者以简化部署的方式运行

        <!--这个插件,可以将应用打包成一个可执行的 jar 包,然后直接使用 java -jar 的命令进行执行 -->
    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

Spring Initializer 快速创建

IDE 都支持使用 Spring 的项目创建向导快速创建一个 SpringBoot 项目。可以根据自己的需求选择不同组件,比如这里选择 Web 组件。

默认生成的 SpringBoot 项目,包括

  • 主程序已经生成好了,我们只需要我们自己的逻辑
  • resources 文件夹中目录结构
    • static 保存所有的静态资源
    • templates 保存所有的模板页面,SpringBoot 默认 jar 包使用嵌入式的 Tomcat,默认不支持 JSP 页面,可以使用模板引擎(freemarker、thymeleaf)
    • application.properties SpringBoot 应用的配置文件,可以修改一些默认设置

HelloWorld 探究

为什么这样简单的步骤和主程序就能运行起来了呢?

为什么能代替 Spring 那么复杂的开发?

POM 文件

完整的 pom.xml 为:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.parzulpan</groupId>
<artifactId>helloworld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>helloworld</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies> <!--这个插件,可以将应用打包成一个可执行的 jar 包,然后直接使用 java -jar 的命令进行执行 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>

注意到有一个 parent 标签

    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <!-- 这个 parent 标签 点进去能得到 -->
<!-- spring-boot-starter-parent-1.5.22.RELEASE.pom -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.22.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>

它来真正管理 SpringBoot 应用里面的所有依赖版本(<artifactId>spring-boot-dependencies</artifactId> 定义了 jar 包的版本),所以以后我们导入依赖默认是不需要写版本的。


然后还注意到了这样的一个依赖

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

它是 SpringBoot 的场景启动器,帮助我们导入了 web 模块正常运行所需要依赖的组件。

SpringBoot 将所有的功能场景都抽取出来,做成一个个的 starters(启动器),只需要在项目里面引入这些 starter,相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。

主程序

它也是主入口类,也是主配置类

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

@SpringBootApplication Spring Boot应用标注在某个类上说明这个类是 SpringBoot 的主配置类,SpringBoot 就应该运行这个类的 main 方法来启动 SpringBoot 应用。


深入查看 @SpringBootApplication 源码,得到:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {}

@SpringBootConfiguration 标注在某个类上,表示这是一个Spring Boot的配置类。它的源码如下,所以配置类也是容器中的一个组件。

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {}

@EnableAutoConfiguration 开启自动配置功能,以前需要配置的东西,SpringBoot 会帮我们自动配置。它的源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}

@AutoConfigurationPackage 自动配置包。它的源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {}

@Import(AutoConfigurationPackages.Registrar.class) 这是 Sping 的底层注解,表示给容器导入一个组件。这里可以看到,导入的组件为 AutoConfigurationPackages.Registrar.class它可以将主配置类(@SpringBootApplication 标注的类)的所在包以及所有自曝理由的所有组件都扫描 Spring 容器中


@Import(EnableAutoConfigurationImportSelector.class) 表示导入哪些组件的选择器,将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。


通过上面的分析,这些注解会给给容器中导入非常多的自动配置类(xxxAutoConfiguration),有了这些自动配置类,就免去了我们手动编写配置注入功能组件等的工作。

SpringBoot 在启动的时候从类路径下的 spring-boot-autoconfigure-1.5.22.RELEASE.jar!/META-INF/spring.factories 中获取 EnableAutoConfiguration 指定的值,将

这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前我们需要自己配置的东西,现在自动配置类都会帮我们自动配置。

练习和总结

【SpringBoot1.x】SpringBoot1.x 入门的更多相关文章

  1. 记 SpringBoot1.* 转 Springoot2.0 遇到的问题

    1.拦截器问题 到2.0之后在配置文件中写 static-path-pattern: /static/** 已经不起作用(2.0需要在方法中配置) SpringBoot1.*写法 @Configura ...

  2. SpringBoot1.x与监控(六)

    由于2.x和1.x的监控不一样,此处先讲1.x 一 SpringBoot1.x监控 pom.xml <dependency> <groupId>org.springframew ...

  3. SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制

    SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制. 升级前 #文件上传配置 ...

  4. 使用SpringBoot1.4.0的一个坑

    时隔半年,再次使用Spring Boot快速搭建微服务,半年前使用的版本是1.2.5,如今看官网最新的release版本是1.4.0,那就用最新的来构建,由于部署环境可能有多套所以使用maven-fi ...

  5. springboot1.5和jpa利用HikariCP实现多数据源的使用

    背景 现在已有一个完整的项目,需要引入一个新的数据源,其实也就是分一些请求到从库上去 技术栈 springboot1.5 (哎,升不动啊) 思路 两个数据源,其中一个设置为主数据源 两个事物管理器,其 ...

  6. 【SpringBoot1.x】SpringBoot1.x 开发热部署和监控管理

    SpringBoot1.x 开发热部署和监控管理 热部署 在开发中我们修改一个 Java 文件后想看到效果不得不重启应用,这导致大量时间花费,我们希望不重启应用的情况下,程序可以自动部署(热部署). ...

  7. 【SpringBoot1.x】SpringBoot1.x 分布式

    SpringBoot1.x 分布式 分布式应用 Zookeeper&Dubbo ZooKeeper 是用于分布式应用程序的高性能协调服务.它在一个简单的界面中公开了常见的服务,例如命名,配置管 ...

  8. 【SpringBoot1.x】SpringBoot1.x 安全

    SpringBoot1.x 安全 文章源码 环境搭建 SpringSecurity 是针对 Spring 项目的安全框架,也是 SpringBoot 底层安全模块默认的技术选型.他可以实现强大的 we ...

  9. 【SpringBoot1.x】SpringBoot1.x 任务

    SpringBoot1.x 任务 文章源码 异步任务 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的.但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使 ...

随机推荐

  1. sqli-labs less13-20(各种post型头部注入)

    less-13 POST型双查询注入 less-14 POST型双查询注入 less-15 POST型布尔注入 less-16 POST型布尔注入 less-17 POST型报错注入(updatexm ...

  2. Linux下常用日志说明

    /var/log/message ------------------------------------------系统启动后的信息和错误日志 /var/log/secure ----------- ...

  3. 目前市面上比较流行的devops运维平台汇总

    1,spug 1,Spug简介 Spug是面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理.主机批量执行.主机在线终端.应用发布.任务计划.配置中心.监控.报警等一系列功能.演示地址 ...

  4. Android studio使用OKGO的POST请求访问http失败的解决方法

    前几天在旧手机(版本是Android7)上调试一个app,用OKGO的post请求连接服务器登录一直很正常.今天旧手机不在身边,用自己的手机调试,就出现网络请求失败的问题,弹onError()里自己写 ...

  5. OkHttpClient调优案例

    OkHttpClient调优案例 作者:Grey 原文地址: 语雀 博客园 Github 实际案例 系统运行一段时间后,线程数量飙升,CPU持续居高不下 排查工具 https://fastthread ...

  6. Shell变量、函数

    上篇文章初步认识了一下shell脚本及其简单的案例,下面我们再来讲一下shell的进击部分. 一.变量 1.常用系统变量:($HOME.$SHELL.$PWD.$USER) 2.自定义变量: 2.1. ...

  7. css 09-CSS案例讲解:博雅互动

    09-CSS案例讲解:博雅互动 #前言 CSS已经学了一些基础内容了,我们来讲解一个小案例吧.以博雅互动的官网首页举例. #版心 首页的版心如下: 这里我们要普及一个概念,叫"版心" ...

  8. OC 大数组分割成由小数组重新组合的新数组

    NSLog(@"++++%@",[self seprateBigArrBySize:3 BigArr:@[@"1",@"2",@" ...

  9. 简析5G时代的MART流处理

    在当今数字驱动的世界中,实时处理数据流是业务成功的必要条件. 5G网络的引入增加了对数据量和速要求,而这些要求给传统的数据架构带来了压力.对吸收数据流量的需求空前增长,同时还要通过跨多个数据流,做出智 ...

  10. 漫画 | 老泪纵横,约会也不敢耽误改bug

    啥都不说了, 直接看图, 就说你中了几枪. 小莱已经抹了好几把辛酸泪-- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 关于作者 作者:大家好,我是莱乌,BAT搬砖工一枚.从 ...