Spring Boot
回顾spring
spring是一个轻量级的IOC和AOP的一站式框架,为简化企业级应用开发而生
优点:
轻量级 IOC AOP 低耦合性(代码之间的耦合度降低,例如IOC有框架创建管理对象,AOP将业务代码和非业务代码分离) 一站式(数据访问层 数据连接管理 mybatis,事务管理 ,对web层的servlet进行封装) 开源 很方便的集成mybatis
开源,轻量级,非侵入式的一站式框架,简化企业级应用开发。 控制反转(IOC),依赖注入(DI)降低了组件之间的耦合性,实现了软件各层之间 的解耦。 面向切面(AOP),利用它可以很容易实现一些拦截,如事务控制等。 spring 对于主流的应用框架提供了很好的支持,例如 mybatis。 spring 提供有自己的 mvc 实现。
缺点:
虽然 spring 的组件代码是轻量级的,但它的配置却是重量级的。虽然 spring 引入了注解功能,但是仍然需要编写大量的模板化配置文件. 项目的依赖管理也是一件耗时耗力的事情,在环境搭建时,需要分析要导入大 量库的坐标,而且还需要分析导入与之有依赖关,一旦选错依赖的版本,随之而 来的不兼容问题就会严重阻碍项目的开发进度。 Spring Boot 对上述 spring 的缺点进行的改善和优化,基于约定优于配置的思 想.可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入 到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目 周期。
1.配置是重量级的,而且有大量模板化配置
2.项目中需要导入很多相关的依赖坐标
Spring Boot 概述
Spring Boot 是由 Pivotal 团队提供的在 spring 框架基础之上开发的框架, 其设计目的是用来简化应用的初始搭建以及开发过程。 Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用 于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是 用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开 发者体验的工具. Spring Boot 以约定大于配置的核心思想,从而使开发人员不再需要定义样 板化的配置。它集成了大量常用的第三方库配置(例如 Redis,Jpa RabbitMQ, Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用, 通过这种方式,Spring Boot 致力于在蓬勃发展的快速应用开发领域成为领导 者。 Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”. We take an opinionated view of the Spring platform and third-party libraries so you can get started with minimum fuss. Most Spring Boot applications need minimal Spring configuration. Spring Boot 你只需要“run”就可以非常轻易的构建独立的、企业级别的 spring 应用。 我们为 spring 平台和第三方依赖库提供了一种固定化的使用方式,使你能非常 轻松的开始开发你的应用程序。大部分 SpringBoot 应用只需要很少的配置
springboot是在spring的基础上,对spring应用的搭建进行简化,基于约定大于配置的思想(大家公认的做法,框架也就默认把一些功能直接实现了,例如注解开发),可以创建一个企业级应用程序 ,内嵌服务器(tomcat等)
有两大核心功能:
起步依赖:起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
自动配置 :Spring Boot 的自动配置是一个运行时(更准确地说,是应用程序启动时) 的过程,考虑了众多因素,才决定 Spring 配置应该用哪个,不该用哪个。该过 程是 Spring 自动完成的
spring启动时,可以根据项目中配置的相关依赖,自动加载配置
SpringBoot 特点
创建独立的 spring 应用程序
直接内嵌 tomcat、jetty 和 undertow
提供了固定化的“starter”配置,以简化构建配置
尽可能的自动配置 spring 和第三方库 提供产品级的功能,如:安全指标、运行状况监测和外部化配置等
绝对不会生成代码,并且不需要 XML 配
springboot搭建
1.创建maven项目
2.配置pom.xml文件
<!--依赖的父级工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.6</version>
<relativePath/>
</parent>
<!--指定 jdk 版本-->
<properties>
<java.version>1.8</java.version>
</properties>
<!--添加基本的 springweb 依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.6</version>
</plugin>
</plugins>
</build>
3.创建自定义的处理器
@RestController
@RequestMapping(path = "logCtl")
public class LoginController {
@RequestMapping(path = "/login")
public String login(){
System.out.println("aa");
return "success";
}
}
4.访问
ip地址:端口号/处理地址/方法地址
springboot中的配置文件
springboot中的配置文件,严格意义上不是配置文件,是用来存储配置参数的文件(里面存放的是参数值).
配置文件有两种格式:1.属性文件 .properties
application.properties 属性文件格式,内容为键值对 server.port=8080 properties 格式比较简单,没有什么难度,在此我们以第二种 yaml
server.port=8080
键=值
-
application.yml
yml 是 YAML(YAML Ain’t Markup Language)语言的文件,以数据为中心.
yml 配置示例 server: port: 8080 yaml 基本语法: 语法结构:key:空格 value; 以此来表示一对键值对(空格不能省略); 以空格的缩进来控制层级关系,只要是左边对齐的一列数据都是同一个层级 的; 字面量直接写在后面就可以,字符串默认不用加上双引号或者单引号; 以#作为注释符号.
#配置服务器端口 server: port: 8088
springboot集成jdbc,mybatis,阿里巴巴数据源
1.导入依赖
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!--springboot jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--springboot集成mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
2.配置application.yml文件
#服务器配置
server:
port: 8088
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
initialSize: 5
maxActive: 20
mybatis:
type-aliases-package: com.ffyc.news.model
mapper-locations: classpath:mappers/*Mapper.xml
configuration:
cache-enabled: true
map-underscore-to-camel-case: true #user_name userName
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
3,编写启动类
@SpringBootApplication
@MapperScan("com.ffyc.news.dao")
public class NewsApplication {
public static void main(String[] args) {
SpringApplication.run(NewsApplication.class);
}
}
4.编写业务代码测试
Spring集成日志功能
日志是软件应用必备的组件,是程序 debug,或是数据收集管理的重要依 据,方便我们监测生产环境的变量值变化以及代码运行轨迹。 主要是为了方便我们监测生产环境的变量值变化以及代码运行轨迹等。这些 记录会被输出到我们指定的位置形成文件,帮助我们分析错误以及用户请求轨 迹。 日志记录可以在程序出现问题时帮助开发人员迅速地定位错误的根源,尤其 是在生产环境中运行的程序更加重要。
日志是程序中重要的组成部分,可以监测程序运行轨迹,记录参数值的变化,尤其是生产环境中非常必要.通过日志文件可以快速定位到问题
常用日志组件
slf4j(Simple Logging Facade for Java)
commons-logging
Log4J
Log4J2
Logback
JUL(Java Utils Logging) springboot 中对这些组件都提供了支持,slf4j 和 commons-logging 是日志的 门面接口,它们都不是具体的日志框架,你可以指定其他主流的日志实现框架。一 般首选强烈推荐使用 slf4j + logback.
日志的级别划分:从低到高:debug<info<warn<error
配置日志级别和日志文件位置
logging:
level:
com.ffyc.news: debug
file:
name: E:/log/log.log
private static Logger logger = LoggerFactory.getLogger(LoginController.class);
logger.debug("account:{},password:{}",admin.getAccount(),admin.getPassword());
logger.info("account:{},password:{}",admin.getAccount(),admin.getPassword());
logger.warn("account:{},password:{}",admin.getAccount(),admin.getPassword());
logger.error("account:{},password:{}",admin.getAccount(),admin.getPassword());
SpringBoot 使用 AOP 统一打印日志
导入依赖 jar
<!--aop-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
@Component
@Aspect
public class LogAspect {
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
@Before("execution(public * com.ffyc.news.web.*.*(..))")
public void savelog(JoinPoint joinPoint) {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
//Object[] objs = joinPoint.getArgs();获取方法参数
// 记录下请求内容
logger.info("HTTP_METHOD :{} ", request.getMethod());
logger.info("IP : {}", request.getRemoteAddr());//客户端 ip
Object[] objects=joinPoint.getArgs();//获取方法参数
logger.info(Arrays.toString(objects));
}
}
springboot统一的异常处理
/*
全局统一的异常处理类*/
@RestControllerAdvice
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
/**
* 异常处理
*/
@ExceptionHandler(Exception.class)
public Result globalException(Exception e) {
Result commonResult = new Result(500,"系统忙"+e.getMessage(),null);
logger.info("Exception:"+e.getMessage());//向日志文件打印信息
return commonResult;//向前端用户响应信息
}
}
统一日志打印,统一异常处理都是AOP的实际使用场景,spring中的事务管理也是AOP的使用场景
搭建前端项目,实现前后端交互
1.前端发送异步请求,出现跨域问题
2.在后端登陆成功后 生成token
导入jwt的jar包 导入jwtutil
4.前端保存用户token,账号
5.在后端搭建管理员token验证的拦截器
6.测试拦截器
springboot注解标签
@SpringBootApplication //spring中最核心的标签,用来启动spring
springboot 实现自动装配的核心仍然是使用注解标签, @SpringBootApplication 是 springboot 核心注解,其中包含 @SpringBootConfiguration,@EnableAutoConfiguration, @ComponentScan. @Configuration 加入@Configuration 注解,表明这就是一个配置类。有一个 myBean()的方法 并用@Bean 进行注释,返回一个 MyBean()的实例,表明这个方法是需要被 Spring 进行管理的 bean。@Bean 如果不指定名称的话,默认使用 myBean 名称,也就是小写的名称。 @Bean 相当于 XML 中的,放在方法的上面,而不是类,意思是产生一 个 bean,并交给 spring 管理。
权限管理
业务分析
大一点的项目,都不是一个管理员操作,可以有多个管理员参与,不同的管理员部门岗位不同,登录后操作的菜单也应该不一样.需要对不同的管理员分配对应的权限菜单
管理员管理
由超级管理员登录到系统中,然后添加其他put管理员,并为其分配操作菜单
登录
不同管理员登录时,可以根据其分配的权限菜单动态显示
数据库设计
1.管理员表admin
id account password phone gender type(1-超级管理员 2-普通管理员) adminid oper_time
2.菜单表menu
id name url type(1系统菜单 2.普通菜单 系统菜单不可分配给普通管理员)
3.管理员-菜单表 admin_menu
id adminid menuid
数据库初始化数据: 1.一个超级管理员2.菜单表中的菜单数据
编码
查询管理员列表
为列表添加查询条件:为了快速进行数据检索,减少了查询的次数
为列表添加分页功能:为了 限制一次过多的数据,提高查询效率
分析分页技术实现:
总记录数(总共有多少条数)
每页显示的条数
总页数=总记录数/每页显示的条数 +1
当前页数n limit (n-1)*每页显示的条数,每页的大小
前端向后端传递:1.当前页数2.每页的条数
后端向前端传递:1.总条数2.对应页的数据集合
新增管理员
1.点击新增按钮 打开新增对话框
2.确定新增对话框要显示哪些内容
3.提交
4.后端保存
5.响应
修改管理员
1.点击修改按钮 打开修改对话框 获得修改记录id 查询管理员信息
2.在修改页面显示管理员信息
3.修改管理员信息
4.提交修改的管理员信息到后端
5.后端修改,响应
删除管理员
1.删除先删除管理员和菜单的关系
2.删除管理员信息
登录
认证:登录时验证账号是否存在,验证账号是否可用
授权:根据管理员分配的权限菜单进行查询