目录
Spring Boot
1. springboot的引言
Spring Boot是由
Pivotal团队提供的全新框架
,其设计目的是用来简化Spring应用的 初始搭建以及开发过程
。该框架使用了特定的方式来进行配置
,从而使开发人员不 再需要定义样板化的配置。通过这种方式,Spring
Boot致力于在蓬勃发展的快速应 用开发领域(rapid application development)成为领导者。
springboot(微框架) = springmvc(控制器) + spring(项目管理)
2. springboot的特点
创建独立的Spring应用程序
嵌入的Tomcat,无需部署WAR文件
简化Maven配置
自动配置Spring
没有XML配置
3. springboot的环境搭建
环境要求:
- MAVEN 3.x+
- Spring FrameWork 5.x+
- JDK8.x +
- Spring Boot 2.2.x+
3.1 项目中引入依赖
<!--继承springboot的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.5.RELEASE</version>
</parent>
<dependencies>
<!--引入springboot的web支持-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.2 引入配置文件
项目中src/main/resources/application.yml
server:
port: 8989 #用来指定内嵌服务器端口号
servlet:
context-path: /scaffold #用来指定项目的url访问路径
3.3 建包并创建控制器
//在项目中创建指定的包结构
/*
com
+| dasuan
+| controller */
@Controller
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String hello(){
System.out.println("======hello world=======");
return "hello";
}
}
3.4 编写入口类
//在项目中如下的包结构中创建入口类 Application
/*
com
+| dasuan */
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
3.5 运行main启动项目
o.s.j.e.a.AnnotationMBeanExporter:Registering beans for JMX exposure on startup
s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8989 (http)
com.baizhi.Application : Started Application in 2.152 seconds (JVM running for 2.611)
//说明: 出现以上日志说明启动成功
3.6 访问项目
//注意: springboot的项目默认没有项目名
//访问路径: http://localhost:8989/scaffold/hello/hello
4. springboot相关注解说明
Spring boot通常有一个名为 xxxApplication的类,入口类中有一个main方法, 在main方法中使用SpringApplication.run(xxxApplication.class,args)启动springboot应用的项目。
@SpringBootApplication 注解等价于: @SpringBootConfiguration 标识注解,标识这是一个springboot的配置类 @EnableAutoConfiguration
自动与项目中集成的第三方技术进行集成 @ComponentScan 扫描入口类所在子包以及子包后代包中注解
5.springboot自动配置原理
6. springboot中配置文件的拆分
#说明: 在实际开发过程中生产环境和测试环境有可能是不一样的 因此将生产中的配置和测试中的配置拆分开,是非常必要的在springboot中也提供了配置文件拆分的方式. 这里以生产中项名名称不一致为例:
生产中项目名为: dasuan
测试中项目名为: springboot
端口同时为: 8080
当前使用的配置文件为:测试
拆分如下:
#主配置文件:
application.yml #用来书写相同的的配置
server:
port: 8080 #生产和测试为同一个端口
spring:
profiles:
active:dev #选择使用哪个配置文件
#生产配置文件:
application-pord.yml
server:
context-path: /dasuan
#测试配置文件:
application-dev.yml
server:
context-path: /springboot
7.springboot 分页
方法很简单,分为两步,第一 导入依赖;第二 配置文件
a.导入依赖
<!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.12</version>
</dependency>
b.编写配置文件
pagehelper:
helper-dialect: mysql #指明数据库 4.0.0以后不需要设置此属性
reasonable: true #启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页
support-methods-arguments: true #支持通过Mapper接口参数来传递分页参数
params: count=countSql #设置为true时,使用RowBounds分页会进行count查询
c.基本使用
//分页查询
public PageInfo<User> bookPageInfo(int pageNum, int pageSize) {
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.getUsers();
PageInfo<User> PageInfo = new PageInfo<User>(users);
return PageInfo;
}
8.springboot中管理对象创建
8.1 管理单个对象
在springboot中可以管理自定义的
简单组件
对象的创建可以直接使用注解形式创建。
1.使用 @Repository @Service @Controller 以及@Component管理不同简单对象
如: 比如要通过工厂创建自定义User对象:
@Component
public class User {
private String id;
private String name;
......
}
2.通过工厂创建之后可以在使用处任意注入该对象
如:在控制器中使用自定义简单对象创建
@Controller
@RequestMapping("hello")
public class HelloController {
@Autowired
private User user;
......
}
8.2 管理多个对象
在springboot中如果要管理
复杂对象
必须使用@Configuration + @Bean
注解进行管理
- 管理复杂对象的创建
@Configuration(推荐)|@Component(不推荐)
public class Beans {
@Bean
public Calendar getCalendar(){
return Calendar.getInstance();
}
}
- 使用复杂对象
@Controller
@RequestMapping("hello")
public class HelloController {
@Autowired
private Calendar calendar;
......
}
注意:
- @Configuration 配置注解主要用来生产多个组件交给工厂管理 (注册形式)
- @Component 用来管理单个组件
9.springboot集成mybatis-plus
9.1引入依赖
<!-- 引入mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.2</version>
</dependency>
<!-- 引入druid数据源-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
9.2配置配置文件
spring:
mvc:
view:
prefix: /
suffix: .jsp
datasource:
type: org.apache.commons.dbcp.BasicDataSource #指定连接池类型
driver-class-name: com.mysql.jdbc.Driver #指定驱动
url: jdbc:mysql://localhost:3306/cmfz #指定url
username: root #指定用户名
password: root #指定密码
9.3加入mybatis配置
#配置mybatis规则
mybatis:
mapper-locations: classpath:mapper/*.xml
#配置全局配置文件,使用此配置后不能使用config-location
configuration:
#开启驼峰命名
map-underscore-to-camel-case: true
call-setters-on-nulls: true
//入口类中加入如下配置:
@SpringBootApplication
@MapperScan("com.baizhi.dao") //必须在入口类中加入这个配置
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
}
}
10.springboot中devtools热部署
10.1引言
为了进一步提高开发效率,springboot为我们提供了全局项目热部署,日后在开发过程中修改了部分代码以及相关配置文件后,不需要每次重启使修改生效,在项目中开启了springboot全局热部署之后只需要在修改之后等待几秒即可使修改生效。
10.2 开启热部署
10.2.1 项目中引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
10.2.2 设置idea中支持自动编译
// 1.开启自动编译
Preferences | Build, Execution, Deployment | Compiler -> 勾选上 Build project automatically 这个选项
// 2.开启允许在运行过程中修改文件
ctrl + alt + shift + / ---->选择1.Registry ---> 勾选 compiler.automake.allow.when.app.running 这个选项
10.3开启IDEA的热部署策略
顶部菜单点击Edit,做如下图更改
10.4关闭浏览器缓存
打开浏览器,按F12,选择NetWork,把Disable cache勾选上
网上大部分配置完第2步就完成热部署,我是配置完第三部才实现的
11.logback日志的集成
11.1 logback简介
Logback是由log4j创始人设计的又一个开源日志组件。目前,logback分为三个模块:logback-core,logback-classic和logback-access。是对log4j日志展示进一步改进
11.2日志的级别
-
DEBUG < INFO < WARN < ERROR
-
日志级别由低到高: 日志级别越高输出的日志信息越少
11.3 项目中日志分类
-
日志分为两类
-
一种是rootLogger : 用来监听项目中所有的运行日志 包括引入依赖jar中的日志
-
一种是logger : 用来监听项目中指定包中的日志信息
11.4 java项目中使用
11.4.1 logback配置文件
logback的配置文件必须放在项目根目录
中 且名字必须为logback.xml
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义项目中日志输出位置-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--定义项目的日志输出格式-->
<!--定义项目的日志输出格式-->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern> [%p] %d{yyyy-MM-dd HH:mm:ss} %m %n</pattern>
</layout>
</appender>
<!--项目中跟日志控制-->
<root level="INFO">
<appender-ref ref="stdout"/>
</root>
<!--项目中指定包日志控制-->
<logger name="com.dasuan.scaffold.dao" level="DEBUG"/>
</configuration>
11.4.2使用默认日志配置
logging:
level:
root: debug
com.baizhi.dao: debug
path: /Users/chenyannan/aa.log
file: bbb.log
12.拦截器
12.1开发拦截器
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println("======1=====");
return true;//返回true 放行 返回false阻止
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("=====2=====");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
System.out.println("=====3=====");
}
}
12.2配置拦截器
@Component
public class InterceptorConfig implements WebMvcConfigurer {
//用来加入拦截器相关配置 参数1:InterceptorRegistry 拦截器注册对象
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加那个拦截器
registry.addInterceptor(new MyInterceptor1())
.addPathPatterns("/**")//拦截所有控制器请求
.excludePathPatterns("/user/findAll","/login");//排除指定的请求;
registry.addInterceptor(new MyInterceptor2())
.addPathPatterns("/**")//拦截所有控制器请求
.excludePathPatterns("/user/findAll");//排除指定的请求;
}
}
13.全局异常配置
通过@ControllerAdvice
,我们可以将对于控制器得全局配置放置在一个位置,可以使用@ExceptionHandler
注解到方法上,这对所有注解了@RequestMapping
的控制器内的方法有效
最简单的用法
定义一个异常配置类
@ControllerAdvice
public class ExceptionConfig {
private Logger logger = org.slf4j.LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(value = Exception.class)
@ResponseBody //返回json格式
public Result ExceptionTest(Exception e){
return Result.fail(400,e.getMessage(),null);
}
// @ExceptionHandler(value = Exception.class)
// @ResponseBody
// public ModelAndView exception(Exception e){
// logger.info("异常信息是: "+e.getMessage());
// ModelAndView modelAndView = new ModelAndView("error"); //指定错误页面
// modelAndView.addObject("errMessage",e.getMessage());
// return modelAndView;
// }
}
通过@ExceptionHandler的valuse属性可以设置拦截条件,在此我们可以拦截所有Exception,大家也可以根据设置过滤其他条件的异常
控制类
@Controller
public class HelloWorld {
@RequestMapping("advice")
@ResponseBody
public Result hello(){
int a=6/0;
return Result.succ("成功了!");
}
}
返回结果集类
@Data
public class Result implements Serializable {
private int code; // 200是正常,非200表示异常
private String msg;
private Object data;
public static Result succ(Object data) {
return succ(200, "操作成功", data);
}
public static Result succ(int code, String msg, Object data) {
Result r = new Result();
r.setCode(code);
r.setMsg(msg);
r.setData(data);
return r;
}
public static Result fail(String msg) {
return fail(400, msg, null);
}
public static Result fail(String msg, Object data) {
return fail(400, msg, data);
}
public static Result fail(int code, String msg, Object data) {
Result r = new Result();
r.setCode(code);
r.setMsg(msg);
r.setData(data);
return r;
}
}
浏览器显示如下
如图则表示全局异常配置已经生效了
持续更新中…