SpringBoot初识
2.常见面试题
- springboot的优点有哪些?
- springboot中注解有哪些?
3.本章重点
- 使用IDEA快速搭建SpringBoot程序
- 使用Maven搭建SpringBoot整合MyBatis
- lombok的使用
- springboot项目热部署
4.内容详解
4.1 SpringBoot简介
4.1.1 spring优缺点分析
4.1.1.1 Spring的优点分析
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。
4.1.1.2 Spring的缺点分析
虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的回报也不少。
除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。
4.1.2 SpringBoot能否解决上述问题,什么是springboot?
SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。
springboot是spring生态圈的一个轻量级框架,换句话说springboot就是spring,是spring的一个衍生版本 springboot是对spring的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行切换,全身心投入到业务逻辑中,从而提高开发效率,缩短项目开发周期。
springboot其实就是集成好了很多框架的spring,直接根据springboot所提供的标准化编写配置即可,不再需要编写xml配置文件,springboot官方给出的解释就是干掉xml文件,使用Java代码进行编写配置
4.1.3 SpringBoot的优点
- 内嵌Tomcat或Jetty等Servlet容器;
- 提供自动配置的“starter”项目对象模型(POMS)以简化Maven配置;
- 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求,尽可能自动配置Spring容器;
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
- SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
4.1.4 SpringBoot核心功能
-
起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西合在一起即支持某项功能。
起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
-
自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
4.2 使用IDEA快速搭建SpringBoot程序
-
创建项目,选择Spring Initializr
-
填写组织名和项目名
-
修改application.properties,修改端口号和部署名
server.port=8087 server.servlet.context-path=/qy105/
-
在resources的templates目录下,新建一个 index.html,打印输出
-
controller中编写简单代码demo
@Controller public class UserController { @RequestMapping("getUser") public String getUser() { System.out.println("request in"); return "index"; } }
-
打成jar包,直接在命令行运行springboot,用cmd命令行或者XShell都可
-
target目录删除,达成war包也可直接运行
-
简单的demo程序完成
4.3 手动搭建SpringBoot整合MyBatis
4.3.1 程序搭建
-
搭建maven程序,pom中引入对应依赖(直接从上个项目中拷贝),一个个解释pom文件中的起步依赖,结合上述的文档描述起步依赖其实是一组坐标的打包。
<properties> <!--<maven.compile.version></maven.compile.version>--> <java.version>11</java.version> </properties> <!--父子工程,所有的springboot项目都必须要继承spring-boot-starter-parent 其实其内部帮我们定义好了一部分的版本的控制--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <!--thymeleaf的启动依赖,thymeleaf是一个前端模板引擎,它可以完全替代JSP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <!--web功能的启动依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot集成junit测试功能的启动依赖--> <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>
-
编写启动类,注意启动类必须位于最上层
@SpringBootApplication public class WebApplication { public static void main(String[] args) { SpringApplication.run(WebApplication.class, args); } }
-
编写controller以及配置文件,配置端口号和部署名,和templates目录中存放的是index.html.
-
注意点,templates名字是默认的,名字要保持一致,目前没有结合后台数据库的程序已经搭建完毕,可以直接运行,与第一个demo程序一样。
-
添加 MyBatis的启动依赖,通过名字看出来,这个启动依赖是MyBatis自己开发的,而不是spring体系中的项目,添加数据源的坐标,如果不添加版本号会报错,因为是外来者,父级工程里面并没有定义版本号因此需要添加MyBatis的版本号,同样的,数据库连接池必须添加版本号。数据库连接驱动可以重写父类的版本号。
<!--MyBatis与springboot集成的启动依赖--> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--druid数据库连接池的依赖--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.20</version> </dependency> <!--添加数据库连接驱动的依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <!--可以重写父类的版本号--> <version>5.1.26</version> </dependency> <!--lombok的依赖,快速生成getter setter方法,不需要version,因为父类工程中有依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
开始编写controller,service,model,mapper,编写model的时候使用 lombok注解,实体类必须实现序列化,使用Lombok,Idea必须安装插件,两个步骤使用Lombok,帮我们解决了一些没有技术含量的代码编写
@Setter @Getter @ToString @EqualsAndHashCode public class Account implements Serializable { private Integer accId; private String accName; private String accMoney; }
-
编写配置文件,先使用的是注解方式,一步步调试
#配置的是服务端口,服务名的信息 server.port=8087 server.servlet.context-path=/qy105/ #配置数据源连接参数 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/spring01 spring.datasource.username=root spring.datasource.password=root spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-
编写mapper接口,先使用注解格式的,再使用xml格式的
@Mapper public interface UserMapper { /** * 获取所有账户 * @return */ @Select("select * from account") List<Account> getAllAccount(); }
-
controller中要想把account打印出来,配置文件必须把驼峰标志启动,使用xml必须把注解的信息去除,以及需要添加别名
#sql映射文件的位置 mybatis.mapper-locations=classpath:mapper/*Mapper.xml #开启驼峰自动映射 mybatis.configuration.map-underscore-to-camel-case=true #开启别名,给整个包起别名 mybatis.type-aliases-package=com.qy105.aaa
-
把数据显示在页面上,也就是编写前端页面显示。
Thymeleaf 是一个和FreeMarker 类似的模板引擎,它可以完全替代 JSP 。相较与其他的模板引擎有如下优点:
-
Thymeleaf 在有网络和无网络的环境下皆可运行,它支持 html 原型,然后在 html 标签里增加额外的属性来达到模板+数据的展示方式,当有数据返回到页面时,Thymeleaf 标签会动态地替换掉静态内容,使页面动态显示。
-
Thymeleaf 开箱即用的特性。它提供标准和spring标准两种方言,可以直接套用模板实现JSTL、 OGNL表达式效果,避免每天套模板、该jstl、改标签的困扰。同时开发人员也可以扩展和创建自定义的方言。
-
. Thymeleaf 提供spring标准方言和一个与 SpringMVC 完美集成的可选模块,可以快速的实现表单绑定、属性编辑器、国际化等功能
-
使用thymeleaf需要添加
<html xmlns:th="http://www.thymeleaf.org">
<!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <table> <tr> <td>账户编号</td> <td>账户名</td> <td>账户余额</td> </tr> <tr th:each="user,index:${accList}"> <td th:text="${index.count}"></td> <td th:text="${user.accName}"></td> <td th:text="${user.accMoney}"></td> </tr> </table> </body> </html>
-
-
log的添加和使用,使用的是slf的log
logging.file.name=demo.log
Java代码中添加
private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
-
小彩蛋 banner.txt位置放在 resource的路径下面
4.3.2 Lombok使用
自动生成get set 方法,减少了没有技术含量的代码的编写
@Setter
@Getter
@ToString(exclude = {"accId","accName"})
@EqualsAndHashCode
@AllArgsConstructor //带有所有参数的构造方法
@NoArgsConstructor //无参的构造方法
public class Account implements Serializable {
private Integer accId;
private String accName;
private String accMoney;
}
4.3.3 热部署
作用:修改html页面会自动加载,修改java代码会自动重启项目
-
在pom文件中添加
<!--热部署的配置依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
-
修改setting 的配置,勾选 build project automatically
-
快捷键,CTRL,shift,alt,+ /