随着动态语言的流行 (Ruby、Groovy、Scala、Node.js),Java 的开发显得格外的笨重:繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大;
.
在上述环境下,Spring Boot 应运而生;它使用“习惯优于配置
”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速的运行起来;使用 Spring Boot 很容易创建一个独立运行(运行 Jar,内嵌 Servlet 容器)准生产级别的基于 Spring 框架的项目,使用 Spring Boot 你可以不用或者只需很少的 Spring 配置;
.
使用 Spring Boot 很容易创建一个独立运行的jar包,它内置了servlet容器(tomcat/jboss等),也就是从现在开始不再出现war包,只用jar包来部署了;
.
SpringBoot让Java具备了开箱即用的特性,减少了大量的配置,加速Java应用程序的开发;
使用Java创建项目的时候,配置文件比较复杂,开发效率低,集成第三方技术的难度大;
SpringBoot简化了spring应用开发的过程;它使用约定优于配置
的开发方式,将Spring、SpringMVC等的一系列模板化的配置文件封装起来,我们创建Java项目的时候,直接根据项目需要选择相应的启动器,就可以快速的启动一个项目,我们不需要再进行复杂的配置了,或者只需要进行很少的配置来替换SpringBoot提供的默认配置;SpringBoot对主流开发框架也提供了无配置集成;
SpringBoot内置了Tomcat和jetty容器,所以我们创建好的项目不用再打包成war包,然后部署到服务器上去运行,直接打包成jar包独立运行就可以了;
缺点:
1、版本更新速度快,一些模块的改动比较大;
2、由于不用自己进行配置了,报错时,很难定位;
优点:
缺点:
1、SpringMVC需要配置
2、静态资源文件都放在resources/static
目录下;
3、页面都放在resources/templates
目录下;前缀默认就是resources/templates
,后缀默认是.html
;
4、mybatis的mapper.xml放在resources/mapper
目录下;
使用Spring初始化器创建一个SpringBoot项目;
程序的入口:只要类上有@SpringBootApplication
注解,并且main函数上调用的SpringApplication.run()
方法,就表示这个应用程序具备了SpringBoot的核心;这个类就是SpringBoot程序的入口;
浏览器访问:localhost:8080
即可;
神奇之处:
没有配置 web.xml
没有配置 application.xml,Spring Boot 帮你配置了
没有配置 application-mvc.xml,Spring Boot 帮你配置了
没有配置 Tomcat,Spring Boot 内嵌了 Tomcat 容器
https://www.funtl.com/zh/spring-boot/Spring-Boot-常用配置.html#本节视频
(1)自定义 Banner: 修改 Spring Boot 启动时的默认的启动图案;
(2)Spring Boot 的配置文件:
Spring Boot 项目使用一个全局的配置文件 application.properties
或者是 application.yml
(一般使用这个),在 resources
目录下或者类路径下的 /config
下,一般我们放到 resources
下;
修改 Tomcat 的端口为 9090,并将默认的访问路径 “/” 修改为 “boot”,可以在 application.yml
中添加:
浏览器访问:http://localhost:9090/boot/
(3)查看自动配置:
查看web下的ServerProperties类,里面配置的属性就是用来在yml配置文件中进行配置的;
@ConfigurationProperties( prefix = "server",ignoreUnknownFields = true)
(4)Starter Pom
Spring Boot 为我们提供了简化企业级开发绝大多数场景的 starter pom ,只要使用了应用场景所需要的 starter pom ,相关的技术配置将会消除,就可以得到 Spring Boot 为我们提供的自动配置的 Bean;
父级的pom是spring-boot-starter-parent
,项目若想成为springboot项目就必须依赖该父pom;spring-boot-starter-parent
依赖spring-boot-dependencies
,spring-boot-dependencies
里面的维护了各个依赖的版本;
所以依赖了springboot的超级pom:spring-boot-starter-parent
的pom中可以不用再指定version;不需要我们再手动维护主流框架的版本号了,只需要修改spring boot的parent的版本号即可,它更新,我们就自动更新;因为spring会测试这些主流框架和spring之间的兼容性好不好;
(5)日志配置
Spring Boot 对各种日志框架都做了支持,我们可以通过配置来修改默认的日志的配置;
默认情况下,Spring Boot 使用 Logback 作为日志框架;
logging:
file: ../logs/spring-boot-hello.log // 日志地址
level.org.springframework.web: DEBUG // 日志级别
(6)关闭特定配置: 使用@SpringBootApplication
注解的exclude
属性;
@SpringBootApplication
注解表明当前类是Springboot的引导类;
exclude属性
:排除指定的自动配置;
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
starter启动器中内容都是自动配置的,自动配置一加载,就一定会生效;比如pom文件中添加了MySQL的启动器,MySQL就需要配置数据源,不配置的话就会报错;但是如果创建的是前端项目,虽然添加了MySQL的依赖,但是不需要使用数据库,这时候就可以使用exclude属性把数据源的配置给排除掉,表示不要自动配置数据源;
Thymeleaf是一个模板引擎,类似Velocity、FreeMarker ,可以完全替代JSP;
Thymeleaf优点:
1、Thymeleaf 在有网络和无网络的环境下皆可运行,即它可以让美工在浏览器查看页面的静态效果,也可以让程序员在服务器查看带数据的动态页面效果,而JSP必须在servlet容器启动才能看;
这是由于它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板 + 数据的展示方式;浏览器解释 html 时会忽略未定义的标签属性,所以 thymeleaf 的模板可以静态地运行;当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示;
.jsp
${user.name}
.html // themeleaf支持HTML原型;
<span th:text="${username}"">zxj</span> //能从服务器读到数据就显示th:的模板数据,读不到就直接显示zxj;
th:text="${username}"
2、无缝对接JSP;
Thymeleaf 开箱即用的特性;它提供标准和 Spring 标准两种方言,可以直接套用模板实现 JSTL、 OGNL 表达式效果,避免每天套模板、改 JSTL、改标签的困扰;同时开发人员也可以扩展和创建自定义的方言;
3、天然支持SpringMVC;
Thymeleaf 提供 Spring 标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能;
为什么使用Themeleaf:
jar包运行不了JSP;
微服务架构,一个服务一个应用进行部署;以应用程序的方式来部署web程序,Java程序要和docker结合,所以最后部署出来的应用应该称之为docker-app;要提供web服务,但是又想以jar包的方式发布,jar包不是web应用程序,要赋予jar包web的能力,程序就要用到内嵌的servlet容器来做到这个效果;
如果希望以 Jar 形式发布模块则尽量不要使用 JSP 相关知识,这是因为 JSP 在内嵌的 Servlet 容器上运行有一些问题 (内嵌 Tomcat、 Jetty 不支持 Jar 形式运行 JSP,Undertow 不支持 JSP)
参考链接
1、添加依赖:thymeleaf启动器和nekohtml的依赖;
nekohtml:正常情况下配置文件中的spring.thymeleaf.mode=HTML5
,使用HTML5就要使用严格的HTML模式:一定要符合w3c标准:每个标签必须要有结束符;
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-thymeleafartifactId>
dependency>
<dependency>
<groupId>net.sourceforge.nekohtmlgroupId>
<artifactId>nekohtmlartifactId>
<version>1.9.22version>
dependency>
2、添加配置:application.yml
spring:
thymeleaf:
cache: false # 开发时关闭缓存,不然没法看到实时页面
mode: HTML # 用非严格的 HTML
encoding: UTF-8
servlet:
content-type: text/html
3、创建一个HTML文件,在文件头部加入标签引入thymeleaf引擎,声明当前页面是一个thymeleaf模板引擎页面;
所有的thymeleaf模板引擎页面使用thymeleaf的时候,都要使用th:
开头;
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>head>
<body>
<span th:text="${user.username}">张三span>
body>
html>
4、创建Controller
@Controller
public class MainController {
@RequestMapping(value = {"", "index"}, method = RequestMethod.GET)
public String index(Model model) {
User user = new User();
user.setUsername("zxj");
model.addAttribute("user", user);
return "index";
}
}
------
public class User implements Serializable {
private String username;
public String getUsername() { return username;}
public void setUsername(String username) { this.username = username;}
}
5、启动项目,浏览器访问:http://localhost:9090/thymeleaf/index
参考链接
Druid 是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括
DBCP、C3P0、BoneCP、Proxool、JBoss DataSource;
(1)在 pom.xml
文件中引入 druid-spring-boot-starter
依赖和数据库连接依赖;
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druid-spring-boot-starterartifactId>
<version>1.1.10version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<scope>runtimescope>
dependency>
(2)在 application.yml
中配置数据库连接:
spring:
datasource:
druid:
url: jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
# MySQL 8.x: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
tk.mybatis
是在 MyBatis 框架的基础上提供了很多工具,可以简化我们对Mybatis的操作,让开发更加高效;
(1)添加依赖:
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapper-spring-boot-starterartifactId>
<version>2.0.2version>
dependency>
(2)添加配置:
mybatis:
type-aliases-package: 实体类的存放路径,如:com.funtl.hello.spring.boot.entity
mapper-locations: classpath:mapper/*.xml
(3)创建一个通用的父级接口:主要作用是让 DAO 层的接口继承该接口,以达到使用 tk.mybatis 的目的;
注意:该接口不能被spring扫描到,否则会出错!就是说,这个接口不能放在启动类所在包下;
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
PageHelper 是 Mybatis 的分页插件,支持多数据库、多数据源,可以简化数据库的分页查询操作,整合过程也极其简单,只需引入依赖即可;
在 pom.xml
文件中引入 pagehelper-spring-boot-starter
依赖
<dependency>
<groupId>com.github.pagehelpergroupId>
<artifactId>pagehelper-spring-boot-starterartifactId>
<version>1.2.5version>
dependency>
我们无需手动编写 实体类、DAO、XML 配置文件,只需要使用 MyBatis 提供的一个 Maven 插件就可以自动生成所需的各种文件便能够满足基本的业务需求,如果业务比较复杂只需要修改相关文件即可;
在 pom.xml
文件中增加 mybatis-generator-maven-plugin
插件:
<build>
<plugins>
<plugin>
<groupId>org.mybatis.generatorgroupId>
<artifactId>mybatis-generator-maven-pluginartifactId>
<version>1.3.5version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xmlconfigurationFile>
<overwrite>trueoverwrite>
<verbose>trueverbose>
configuration>
<dependencies>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>${mysql.version}version>
dependency>
<dependency>
<groupId>tk.mybatisgroupId>
<artifactId>mapperartifactId>
<version>3.4.4version>
dependency>
dependencies>
plugin>
plugins>
build>
指定自动生成所需的配置文件路径;
generatorConfig.xml
在 src/main/resources/generator/
目录下创建 generatorConfig.xml
配置文件,指定数据源等信息;
完整配置案例
<generatorConfiguration>
<properties resource="jdbc.properties"/>
<context id="Mysql" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<plugin type="tk.mybatis.mapper.generator.MapperPlugin">
<property name="mappers" value="com.funtl.utils.MyMapper"/>
plugin>
<jdbcConnection
driverClass="${jdbc.driverClass}"
connectionURL="${jdbc.connectionURL}"
userId="${jdbc.username}"
password="${jdbc.password}">
jdbcConnection>
<javaModelGenerator targetPackage="com.funtl.hello.spring.boot.entity" targetProject="src/main/java"/>
<sqlMapGenerator targetPackage="mapper" targetProject="src/main/resources"/>
<javaClientGenerator
targetPackage="com.funtl.hello.spring.boot.mapper"
targetProject="src/main/java"
type="XMLMAPPER"/>
<table catalog="myshop" tableName="%">
<generatedKey column="id" sqlStatement="Mysql" identity="true"/>
table>
context>
generatorConfiguration>
在 src/main/resources
目录下创建 jdbc.properties
数据源配置;
# MySQL 8.x: com.mysql.cj.jdbc.Driver
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=123456
mvn mybatis-generator:generate
(1)修改入口类:在类上增加注解@MapperScan
来指定mapper接口的包路径;
@SpringBootApplication
@MapperScan(basePackages = "com.funtl.hello.spring.boot.mapper")
public class HelloSpringBootApplication {
public static void main(String[] args) { SpringApplication.run(HelloSpringBootApplication.class, args); }
}
(2)创建测试类:
@RunWith(SpringRunner.class)
// 指定启动类,为了让测试类能装载到SpringBoot的配置文件application.yml;
@SpringBootTest(classes = HelloSpringBootApplication.class)
@Transactional // 加入事务
@Rollback // 加入事务
public class MyBatisTests {
@Autowired // 注入数据查询接口
private TbUserMapper tbUserMapper;
@Test // 测试插入数据
public void testInsert() {
// 构造一条测试数据
TbUser tbUser = new TbUser();
tbUser.setUsername("Lusifer"); // ......
tbUserMapper.insert(tbUser);
}
@Test // 测试删除数据
public void testDelete() {
// 构造条件,等同于 DELETE from tb_user WHERE username = 'Lusifer'
Example example = new Example(TbUser.class);
example.createCriteria().andEqualTo("username", "Lusifer");
tbUserMapper.deleteByExample(example);
}
@Test // 测试修改数据
public void testUpdate() {
// 构造条件
Example example = new Example(TbUser.class);
example.createCriteria().andEqualTo("username", "Lusifer");
// 构造一条测试数据
TbUser tbUser = new TbUser();
tbUser.setUsername("LusiferNew"); // ......
tbUserMapper.updateByExample(tbUser, example);
}
@Test // 测试查询集合
public void testSelect() {
List<TbUser> tbUsers = tbUserMapper.selectAll();
for (TbUser tbUser : tbUsers) {
System.out.println(tbUser.getUsername());
}
}
@Test // 测试分页查询
public void testPage() {
// PageHelper 使用非常简单,只需要设置页码和每页显示笔数即可
PageHelper.startPage(0, 2);
// 设置分页查询条件
Example example = new Example(TbUser.class);
PageInfo<TbUser> pageInfo = new PageInfo<>(tbUserMapper.selectByExample(example));
// 获取查询结果
List<TbUser> tbUsers = pageInfo.getList();
for (TbUser tbUser : tbUsers) {
System.out.println(tbUser.getUsername());
}
}
}
文章参考博客视频教程