【SpringBoot1.x】SpringBoot1.x 入门
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.propertiesSpringBoot 应用的配置文件,可以修改一些默认设置
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 入门的更多相关文章
- 记 SpringBoot1.* 转 Springoot2.0 遇到的问题
1.拦截器问题 到2.0之后在配置文件中写 static-path-pattern: /static/** 已经不起作用(2.0需要在方法中配置) SpringBoot1.*写法 @Configura ...
- SpringBoot1.x与监控(六)
由于2.x和1.x的监控不一样,此处先讲1.x 一 SpringBoot1.x监控 pom.xml <dependency> <groupId>org.springframew ...
- SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制
SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制. 升级前 #文件上传配置 ...
- 使用SpringBoot1.4.0的一个坑
时隔半年,再次使用Spring Boot快速搭建微服务,半年前使用的版本是1.2.5,如今看官网最新的release版本是1.4.0,那就用最新的来构建,由于部署环境可能有多套所以使用maven-fi ...
- springboot1.5和jpa利用HikariCP实现多数据源的使用
背景 现在已有一个完整的项目,需要引入一个新的数据源,其实也就是分一些请求到从库上去 技术栈 springboot1.5 (哎,升不动啊) 思路 两个数据源,其中一个设置为主数据源 两个事物管理器,其 ...
- 【SpringBoot1.x】SpringBoot1.x 开发热部署和监控管理
SpringBoot1.x 开发热部署和监控管理 热部署 在开发中我们修改一个 Java 文件后想看到效果不得不重启应用,这导致大量时间花费,我们希望不重启应用的情况下,程序可以自动部署(热部署). ...
- 【SpringBoot1.x】SpringBoot1.x 分布式
SpringBoot1.x 分布式 分布式应用 Zookeeper&Dubbo ZooKeeper 是用于分布式应用程序的高性能协调服务.它在一个简单的界面中公开了常见的服务,例如命名,配置管 ...
- 【SpringBoot1.x】SpringBoot1.x 安全
SpringBoot1.x 安全 文章源码 环境搭建 SpringSecurity 是针对 Spring 项目的安全框架,也是 SpringBoot 底层安全模块默认的技术选型.他可以实现强大的 we ...
- 【SpringBoot1.x】SpringBoot1.x 任务
SpringBoot1.x 任务 文章源码 异步任务 在 Java 应用中,绝大多数情况下都是通过同步的方式来实现交互处理的.但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使 ...
随机推荐
- sqli-labs less13-20(各种post型头部注入)
less-13 POST型双查询注入 less-14 POST型双查询注入 less-15 POST型布尔注入 less-16 POST型布尔注入 less-17 POST型报错注入(updatexm ...
- Linux下常用日志说明
/var/log/message ------------------------------------------系统启动后的信息和错误日志 /var/log/secure ----------- ...
- 目前市面上比较流行的devops运维平台汇总
1,spug 1,Spug简介 Spug是面向中小型企业设计的无 Agent的自动化运维平台,整合了主机管理.主机批量执行.主机在线终端.应用发布.任务计划.配置中心.监控.报警等一系列功能.演示地址 ...
- Android studio使用OKGO的POST请求访问http失败的解决方法
前几天在旧手机(版本是Android7)上调试一个app,用OKGO的post请求连接服务器登录一直很正常.今天旧手机不在身边,用自己的手机调试,就出现网络请求失败的问题,弹onError()里自己写 ...
- OkHttpClient调优案例
OkHttpClient调优案例 作者:Grey 原文地址: 语雀 博客园 Github 实际案例 系统运行一段时间后,线程数量飙升,CPU持续居高不下 排查工具 https://fastthread ...
- Shell变量、函数
上篇文章初步认识了一下shell脚本及其简单的案例,下面我们再来讲一下shell的进击部分. 一.变量 1.常用系统变量:($HOME.$SHELL.$PWD.$USER) 2.自定义变量: 2.1. ...
- css 09-CSS案例讲解:博雅互动
09-CSS案例讲解:博雅互动 #前言 CSS已经学了一些基础内容了,我们来讲解一个小案例吧.以博雅互动的官网首页举例. #版心 首页的版心如下: 这里我们要普及一个概念,叫"版心" ...
- OC 大数组分割成由小数组重新组合的新数组
NSLog(@"++++%@",[self seprateBigArrBySize:3 BigArr:@[@"1",@"2",@" ...
- 简析5G时代的MART流处理
在当今数字驱动的世界中,实时处理数据流是业务成功的必要条件. 5G网络的引入增加了对数据量和速要求,而这些要求给传统的数据架构带来了压力.对吸收数据流量的需求空前增长,同时还要通过跨多个数据流,做出智 ...
- 漫画 | 老泪纵横,约会也不敢耽误改bug
啥都不说了, 直接看图, 就说你中了几枪. 小莱已经抹了好几把辛酸泪-- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 关于作者 作者:大家好,我是莱乌,BAT搬砖工一枚.从 ...