SpringBoot 简介
Spring boot是构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性,其核心主要有如下几个方面:
1 起步依赖 项目创建时底层帮你关联依赖。
2 自动配置
3 健康检查(Actator)-监控。
SpringBoot 环境配置
1 JDK
2 STS,IDEA等开发工具 --(STS是集成了spring插件的eclipse)
3 配置Maven(本地仓库,阿里云镜像)
简单注解引入
@Component
@Scope("singleton")
@Lazy
public class ObjectPool {
public ObjectPool() {
System.out.println("ObjectPool()");
}
@PostConstruct
public void init() {
System.out.println("init()");
}
@PreDestroy
public void destory() {
System.out.println("destory");
}
}
其中:
@Lazy注解描述类,告诉spring框架此类支持延迟加载,通常会配合单例作用域使用。使用时才会创建实例
@Scope 是Spring中用于定义Bean对象作用域的一个注解,其常用的值(引号引起来)有"singleton"(整个内存有一份Bean实例,此实例创建以后,生命周期会由spring框架管理),“prototype”(多例模式,每次获取都会创建新实例,此实例会在需要时创建与lazy特性无关,这个实例创建以后,不会交给spring管理,spring可以对其初始化,但不负责销毁。)等。
@PostConstruct 注解用于描述bean对象生命周期方法中的初始化方法,此方法会在对象的构造方法之后执行(是对象创建以后的初始化)。
@PreDestroy 注解用于描述Bean对象生命周期方法中的销毁方法,此方法会在对象销毁之前执行(当作用域为prototype时,此方法不会执行)。
一个接口有多个实现类的对象时,并且这些对象都交给了Spring管理
public class CacheTests {
@Autowired
@Qualifier("softCache") //使用注解直接指定本次注入的bean对象
private Cache cache;
@Test
public void testCache() {
System.out.println(cache);
}
}
***@Autowired***由spring框架定义,描述类中属性或相关方法(例如构造方法)。Spring框架在项目运行时假如发现由他管理的Bean对象中有使用@Autowired注解描述的属性或方法,可以按照指定规则为属性赋值(DI依赖注入)。其基本规则是:首先要检测容器中是否有与属性或方法参数类型相匹配的对象,假如有并且只有一个则直接注入。其次,假如检测到有多个,还会按照@Autowired描述的属性或方法参数名查找是否有名字匹配的对象,有则直接注入,没有则抛出异常。最后,假如我们有明确要求,必须要注入类型为指定类型,名字为指定名字的对象还可以使用@Qualifier注解对其属性或参数进行描述(此注解必须配合@Autowired注解使用)。
Spring框架管理Bean对象优势(面试)
Spring 是一个***资源整合框架***(Framework),通过spring可将很多资源(自己写的对象或第三方提供的***对象***,例如连接池等)整合在一起,然后进行***科学应用***,以便更好的对外提供服务
Spring框架可以为由它管理的(Bean)对象提供***懒加载***策略(对象暂时用不到,则无需加载和实例化),作用域(例如singleton-频繁用时可以考虑内存中只有一份,prototype-使用次数少时可以用时创建,不用时销毁),生命周期方法(更好实现对象的初始化和资源销毁),以实现对象对系统资源的有效使用。同时Spring框架还可以***基于用户设计管理对象与对象的依赖关系***,以降低对象与对象之间的直接耦合,提高程序的可维护性和可扩展性。
拾遗
Spring boot项目启动时,Bean的初始化过程是怎样的?(查找-交给spring管理的,加载,读和存储配置,创建和存储实例对象)
Spring boot 项目启动时,Bean对象的依赖注入过程是怎样的?(标记,查找,注入)
Spring 框架中的Bean对象有什么特性?(延迟加载,作用域,生命周期方法)
Spring Boot项目中支持的配置文件后缀有哪些?(.properties,.yml)
如何理解Spring框架?(资源整合框架,科学应用对象-资源,低耦合)
springboot整合连接池(HikariCP连接池)–默认
HiKariCP号称是目前世界上最快的连接池,有江湖一哥的称号
1 pom.xml文件中添加依赖-mysql数据库驱动依赖和dbc依赖 --Java数据库连接(Java Database Connectivity,简称JDBC)
2 application.properties配置文件配置连接池
spring.datasource.url=jdbc:mysql:///dbgoods?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
3 测试获取连接
@SpringBootTest
public class DataSourceTests {
@Autowired
private DataSource dataSource;
@Test
public void testConnection() throws Exception{
System.out.println(dataSource.getConnection());
}
}
springboot整合MyBatis框架
Mybatis是一个优秀的持久层框架,底层基于JDBC实现与数据库的交互。并在JDBC操作的基础上做了封装和优化,它借助灵活的SQL定制,参数及结果集的映射方式,更好的适应了当前互联网技术的发展。mybatis框架通常会由spring框架进行资源整合,作为数据层技术,实现数据交互操作
1 pom文件中添加mybatis启动依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
//版本有个别依赖需要指定,大部分都不需要指定
2 application.properties文件简易配置
mybatis.configuration.default-statement-timeout=30
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.com.cy=DEBUG
配置mybatis中的sql日志的输出:(com.cy为项目的根包)
3 测试
package com.cy.pj.goods.dao;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface GoodsDao {
@Delete("delete from tb_goods where id=#{id}")
int deleteById(Integer id);
}
@Mapper是由MyBatis框架中定义的一个描述数据层接口的的注解(所有的注解只起到一个描述性的作用),用于告诉Spring框架此接口的实现由mybatis创建–即mybatis框架会为该接口创建代理对象(实现类),并将其实现类对象存储到spring容器.
@SpringBootTest
public class GoodsDaoTests {
@Autowired
private GoodsDao goodsDao; //依赖注入mybatis框架创建的代理对象
@Test
public void testDeleteById() {
int rows=goodsDao.deleteById(10);
System.out.println("rows="+rows);
}
}
或将sql语句写到对应的Mapper.xml映射文件中
int deleteObjects(@Param("ids")Integer... ids); //mapper接口中
application.properties文件中添加配置 --指定映射文件
mybatis.mapper-locations=classpath:/mapper/*/*.xml
GoodsMapper.xml文件中 --复杂的一般都要写在这里
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.pj.goods.dao.GoodsDao">
<delete id="deleteObjects">
delete from tb_goods
where id in <!-- (1,2,3,4,5) -->
<foreach collection="ids"
open="("
close=")"
separator=","
item="id">
#{id}
</foreach>
</delete>
</mapper>
删除测试
@Test
public void testDeleteObjects() {
int rows=goodsDao.deleteObjects(17,18);
System.out.println(rows);
}
springboot 整合SpringMVC
MVC(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。目的是通过这样的设计使程序结构更加简洁、直观,降低问题的复杂度,实现***高内聚,低耦合***。各组成部分职责:
View - UI设计人员进行图形界面设计,负责实现与用户交互。
Controller - 负责获取请求,处理请求,响应结果。(controller)–底层就是servlet,貌似不严谨dispatcherServlet是前端控制器而貌似controller调service中的controller可以理解为一个后端控制器…
Model - 实现业务逻辑,数据逻辑实现。(service-dao)
1 pom.xml文件,添加Spring web依赖,Thymeleaf依赖 – Thymeleaf 是一个跟 Velocity、FreeMarker 类似的html模板引擎,它可以完全替代 JSP
Web依赖(提供了Spring MVC核心API,同时会嵌入一个Tomcat服务器)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
Thymeleaf依赖(提供了一个视图解析器对象以及数据绑定机制)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
2 application.properties文件添加视图解析器配置(假如没有配置也会默认配置,在默认配置中prefix默认值为classpath:/templates/,后缀默认为.html)
spring.thymeleaf.prefix=classpath:/templates/pages/
spring.thymeleaf.suffix=.html
说明:要基于配置在src/main/resources目录下创建templates/pages目录
3 测试 --Spring MVC 进行入门实践
package com.cy.pj.goods.controller;
@Controller
@RequestMapping("/goods/")
public class GoodsController {
@RequestMapping("doGoodsUI")
public String doGoodsUI() {
return "goods";
}
}
需要在/templates/pages/目录下创建goods.html(至于html中内容任意)
启动服务器(默认项目嵌入的是tomcat),打开浏览器进行访问测试。
http://localhost:8080/goods/doGoodsUI
拾遗
Java中连接池对象的标准API是什么?(DataSource)
Java中标准JDBC API中哪个对象负责与数据库建立连接?(Driver)
@Mapper注解的作用什么?(描述数据层接口,是由mybatis框架定义的规范)
@Mapper 描述数据层接口时,底层会为接口做点什么?(创建实现类,创建实现类对象,并将对象存储到spring容器-bean池。)
STS 工具常用快捷键(alt+/,ctrl+shift+t,ctrl+t,ctrl+o,…)
SpringBoot的综合应用
1 业务需求分析及设计
第一:需求调研 (与软件使用人之间的一个沟通,了解其业务)
第二:需求分析 (对需求调研内容的总结和细化)
第三:原型设计 (是对需求分析结果的更好呈现)
第四:需求评审 (签字确认,确认边界,确定业务模块)
简历:参与了需求调研,需求分析,原型设计,需求评审。
2 系统架构分析及设计
第一:架构模式?(CS/BS)
第二:单体架构,分布式架构,微服务架构?
第三:部署架构?(web服务器一台,数据库服务器一台,…)
第四:系统整体分层架构?(基础设施,操作系统,中间件,应用软件,接入层)
第五:软件应用的分层架构?(表示层,请求响应控制逻辑层,业务处理逻辑层,数据操作逻辑层,数据库)
3 业务代码分析及设计
第一步骤:原型设计(省略)
第二步骤:数据库及表设计并初始化。(基于source指令去实现 )
第三步骤:应用架构设计(MVC)
第四步骤:业务设计,API设计,时序设计?
第五步骤:POJO对象,数据层对象,业务层对象,控制层对象,表示层。
项目示例引入
1 搭建项目初始环境
第一步:初始化数据库数据 --cmd
mysql -uroot -proot
set names utf8
source d:/activity.sql
第二步: 创建SpringBoot maven项目
第三步:添加项目依赖(MySql,Jdbc API,MyBatis,Spring Web,Thymeleaf)
第四步:application.properties文件,进行资源配置
1)添加数据源配置(使用内置的HikariCP连接池)
2)添加mybatis配置
3)添加thymeleaf配置
4)添加日志配置
#spring datasource
spring.datasource.url=jdbc:mysql:///dbactivity?serverTimezone=GMT%2B8&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#spring mybatis
mybatis.mapper-locations=classpath:/mapper/*/*.xml
#spring web
spring.thymeleaf.prefix=classpath:/templates/pages/
#Spring log
logging.level.com.cy=debug
完成项目初始化
2 服务端实现
第一步:定义pojo对象(com.cy.pj.activity.pojo.Activity)
第二步:定义ActivityDao接口及方法
第三步:定义ActivityService接口及实现类
第四步:定义ActivityController对象及url映射
3 客户端实现
第一步:定义activity.html页面
第二步:通过Thymeleaf模板引擎将活动数据呈现在页面上。
拾遗
1 Thymeleaf 是一个跟 Velocity、FreeMarker 类似的html模板引擎,它可以完全替代 JSP --提供了一个视图解析器对象以及数据绑定机制
2 Bootstrap是基于HTML、CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。Bootstrap提供了优雅的HTML和CSS规范。
3 easyui是基于jQuery、Angular.、Vue和React的用户界面组件的集合。
easyui提供了构建现代交互式javascript应用程序的基本功能。
使用easyui,您不需要编写许多javascript代码,通常通过编写一些HTML标记来定义用户界面。
完整的HTML5网页框架。
使用easyui开发你的产品时可以大量节省你的时间和规模。
easyui使用非常简单但功能非常强大。
4 Vue 是一套构建用户界面的渐进式框架。
Vue 只关注视图层, 采用自底向上增量开发的设计。方便与第三方库或既有项目整合。
Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。
5 Thymeleaf模板引擎常用标签有哪些?(th:each,th:text,th:value,th:href,…)
=====
三者区别
bootstrap
bootstrap是twitter的框架,用来让网站适应不同的屏幕分辨率和设备的 --特点是栅格系统, 使用简单, 专为响应式页面而生,一套代码就可以自适应平板电脑和PC.
bootstrap适合做网站类项目
bootstrap 是css框架
easyui
easyui是让界面看起来更好看些
easyui适合做系统类项目
easyUI IE的兼容性有点问题
easyui是js框架
Vue
特点在于, 在React的基础上扩展:
- 数据的双向绑定.数据改,页面改. 页面改, 数据也改.
- 页面的呈现快.
- 组件化 这和BootStrap这种组件化的概念还有点不同, js测试也变得更专业化了(有点类似junit).
- 单html开发. 它的开发模式, 是一个html, 然后不停替换组件对应的js来切换显示效果. html中的共通js和css只需要download一次, 理论上比Iframe页面的呈现更快.
- 结合node.js提供的webpack等, 可以进行成体系的打包发布.
缺点在于, 上手难度比较高, 并且大规模开发的化, 需要有体系化开发的积累. Vue的组件化开发推荐使用Elem
=====
5 健康检查 --项目中添加Actuator依赖后即可访问健康检查监控…
http://localhost/actuator
假如希望查看更多actuator选项,可以在spring boot中配置文件
application.properties中添加如下语句:(***生产环境不加!!***)
management.endpoints.web.exposure.include=*
说明:还可以直接在sts工具的Boot Dashboard中选中项目(项目必须已启动),查看其属性(show properties)!!
Lombok插件应用
Lombok是一个第三库,可以基于lombok中提供的API,在程序编译时自动织入一些方法。这样做的话可以简化我们对某些方法的编写,例如,省略pojo类中的set方法,get方法,toString等方法的编写。我们写的java程序可以在编译时,通过lombok自动将这些方法添加到.class文件中,其应用步骤如下:–貌似只是STS中需要***IDEA中直接安装插件后在pom文件中添加Lombok依赖即可使用!!!***
1 添加依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2 找到下载的lombok-xxx.jar依赖所在的位置。
3 启动操作系统命令行客户端cmd,并切换到lombok-xxx.jar文件所在的目录,然后,利用java –jar 指令启动lombok插件
4 会弹出选择安装对话框 --然后在弹出的框中选择sts启动执行文件(SpringToolSuite4.exe)进行安装
5 安装成功以后会出现如下弹出框
安装成功以后可在STS工具的根目录看到一个lombok.jar文件,同时会在SpringToolSuite4.ini文件的尾部添加lombok.jar文件所在的具体路径
说明:安装成功以后重启sts工具.(假如安装成功以后再次启动sts,此时无法启动,可能与STS所在目录有关系,可以将安装目录下的lombok.jar文件拷出到特定目录,然后修改SpringToolSuite4.ini文件的最后一行的lombok.jar路径即可,同时在配置文件中也不能有空格)
Lombok 常用注解分析:
@Setter 用于为描述的类生成setter方法,不包含final修饰属性。
@Getter 用于为描述的类生成getter方法。
@ToString 用于为描述的类添加toString方法。
@EqualsAndHashCode 用于为描述的类,生成hashCode和equals方法。
@NoArgsConstructor 用于为描述的类生成无参的构造方法。
@AllArgsConstructor 用于为描述的类生成包含类中所有字段的构造方法。
@Data用于为描述的类生成setter/getter、equals、canEqual、hashCode、toString方法,如为final属性,则不会为该属性生成setter方法。
@Slf4J 用于为描述的类添加一个日志属性对象
代码案例分析:
package com.cy.pj.activity.pojo;
@Data
public class Activity {//.class
private Long id;
private String title;
private String category;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") //指定时间属性格式
private LocalDateTime startTime;
@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss")
private LocalDateTime endTime;
private Short state=1;//1 有效状态
private String remark;
private String createdUser;
private LocalDateTime createdTime;
}
package com.cy.pj.pojo;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@SpringBootTest
public class ActivityTests {
@Test
public void testAty01() {
Activity aty=new Activity();
aty.setId(10L);
aty.setTitle("A-Title");
aty.setCategory("A-Type");
System.out.println(aty.getId());
System.out.println(aty.getTitle());
System.out.println(aty.getCategory());
log.info(aty.toString());
}
}