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. STL—— 容器(vector)的内存分配,声明时的普通构造&带参构造

    vector 的几种带参构造 & 初始化与内存分配: 1. 普通的带参构造: vector 的相关对象可以在声明时通过 vector 的带参构造函数进行内存分配,如下: 1 #include ...

  2. 在Chrome、Firefox等高版本浏览器中实现低延迟播放海康、大华RTSP

    一.背景 现在到处是摄像头的时代,随着带宽的不断提速和智能手机的普及催生出火热的网络直播行业,新冠病毒的大流行又使网络视频会议系统成为商务会议的必然选择,因此RTSP实时视频流播放及处理不再局限于安防 ...

  3. 四、LoadRunner11安装和破解

    之前安装了LoadRunner12 社区版的,应为满足不了工作需求, 上网仔细查了教程下来LoadRunner11破解版 链接:https://pan.baidu.com/s/1dM8Lwf4p160 ...

  4. mysql位函数的使用

    查询每个月的访问天数 mysql> create table t1 (year YEAR(4),month int(2) unsigned zerofill,day int(2) u nsign ...

  5. [打基础]luogu2181对角线——计数原理

    啦啦啦我ysw又回来啦!之后大概会准备打acm,暑假尽量复习复习,因为已经快两年没碰oi了,最多也就高三noip前学弟学妹出题讲题,所以从这一篇blog开始大概会有一系列"打基础" ...

  6. 一位年薪30w软件测试员的职业规划

    先抛出一个观点: 那些,担心30岁后,35岁后,40岁后,无路可走的:基本属于能力不够.或者思维太局限.总之,瞎担心/不长进. 具体,见下面正文 曾经,在16年,写过一系列的软件测试从业者职业成长文章 ...

  7. Web服务器-服务器开发-返回浏览器需要的页面 (3.3.2)

    @ 目录 1.说明 2.代码 关于作者 1.说明 使用正则表达式,匹配客户端的请求头 获取到请求的路径 返回对应请求路径的文字 可以使用打开对应文件的方式去返回对应的文件 2.代码 from sock ...

  8. <未解决的问题>crontab 定时弹框任务

    问题:crontab写别的定时脚本就可以执行(比如说每隔一分钟就创建一个txt文件),但是写shell就不知道为什么,反弹不了 但是开启Linux终端窗口单独执行bash shell时候,(不通过re ...

  9. vscode php转到定义

    点击再settings.json 中编辑 添加这一行,内容为php的安装路径

  10. APEX-数据导出/打印

    前言: 由于公司使用了Oracle APEX构建应用,且在APEX新版本v20.2版本中增强了相关报表导出数据相关功能:正好现在做的事情也需要类似的功能,就先来学习一下Oracle的APEX相关功能及 ...