Springboot简介:
Spring Boot是在Spring的基础上面搭设的框架,目的是为了简化Spring项目的搭设和开发过程。不存在冲突的问题。其实不是什么新的框架,它默认配置了很多的框架的使用方式,就像maven整合了所有的jar包,springboot整合了多数的框架。
总之:人们把springboot称之为搭建程序的脚手架,其最主要的作用就是帮我们快速的构建庞大的spring项目,并且尽可能的减少一切xml配置,做到开箱即用,迅速上手,让我们关注与业务而非配置。
SpringBoot有哪些优点?
- 独立运行
Spring Boot 而且内嵌了各种 servlet 容器,Tomcat、Jetty 等,现在不再需要打成war 包部署到容器中,Spring Boot 只要打成一个可执行的 jar 包就能独立运行,所有的依赖包都在一个 jar 包内。 - 简化配置
spring-boot-starter-web 启动器自动依赖其他组件,简少了 maven 的配置。 - 自动配置
Spring Boot 能根据当前类路径下的类、jar 包来自动配置 bean,如添加一个 spring-boot-starter-web 启动器就能拥有 web 的功能,无需其他配置。 - 无代码生成和XML配置
Spring Boot 配置过程中无代码生成,也无需 XML 配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是 Spring4.x 的核心功能之一。 - 避免大量的Maven导入和各种版本冲突
运行原理:
自动配置;
核心依赖在父工程中:spring-boot-dependences
我们在写或者引入springboot依赖的时候,不需要指定版本,就是因为有这些版本仓库
启动器:一段依赖
说白了就是springboot的启动场景.
Sringboot的启动器:所谓的 springBoot 启动器其实就是一些 jar 包的集合,这些启动器帮我们导入了实现各个功能所需要依赖的全部组件,我们只需要在项目中引入这些starters,相关场景的所有依赖就会全部被导入进来,并且我们可以抛弃繁杂的配置,仅需要通过配置文件来进行少量的配置就可以使用相应的功能。
starter启动器,可以通过启动器集成其他的技术,比如说:web,mybatis,Redis等等可以提供对应技术的开发和运行环境,
比如:pom中引入spring-boot-starter-web就可以进行web开发
springApplication这个类整合了其它框架的启动类,只要运行这一个类,所有的整合就完成了,
调用run函数,将当前启动类的字节码传入(主要目的是传入@SpringbootApplication这个注解)以及main函数的args参数
通过获取当前启动类的核心信息,创建IOC容器
核心设计思想:总之一个@SpringbootAplication注解就搞定了所有的事,它封装了核心的@SpringbootConfiguration+@EnableAutoConfiguration+ComponentScan这三个类,大大节省了程序员的配置时间,这就是springboot的核心设计思想。
@MapperScan:spring-boot支持mybatis组件的一个注解,通过此注解指定mybatis 接口类的路径,即可完成对 mybatis 接口的扫描
@RestController 是 @Controller 和 @ResponseBody 的 结 合 , 一 个 类 被 加 上 @RestController 注解,数据接口中就不再需要添加@ResponseBody,更加简洁。 @RequestMapping,我们都需要明确请求的路径.
@GetMappping,@PostMapping, @PutMapping, @DeleteMapping 结 合 @RequestMapping 使用, 是 Rest 风格的, 指定更明确的子路径.
@PathVariable:路径变量注解,用{}来定义 url 部分的变量名.
@Service 这个注解用来标记业务层的组件,我们会将业务逻辑处理的类都会加上这个 注解交给 spring 容器。事务的切面也会配置在这一层。当让 这个注解不是一定要用。 有个泛指组件的注解,当我们不能确定具体作用的时候 可以用泛指组件的注解托付给 spring 容器
@Component 和 spring 的注解功能一样, 注入到 IOC 容器中.
@ControllerAdvice 和 @ExceptionHandler 配合完成统一异常拦截处理
知识点小结:
一,可以在官网直接下载,还可以用idea下载。
二,启动类:
package com.zhang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
//标注这个类是一个springboot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {
//将springboot 应用启动
public static void main(String[] args) {
SpringApplication.run(Springboot01HelloworldApplication.class, args);
}
}
三,springboot自动装配原理探究:
pom.xml:
spring-boot-dependencies:核心依赖在父工程中
我们在写或引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库。
启动器:说白了就是springboot的启动场景
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
比如;spring-boot-starter-web,他就会帮我们自动导入web环境所有的依赖
springboot会将所有的功能场景,都变成一个个的启动器
我们要使用什么功能,就只需要找到对应的启动器就可以了,starter
四:主程序:
package com.zhang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; //标注这个类是一个springboot的应用:启动类下的所有资源被导入
@SpringBootApplication public class Springboot01HelloworldApplication { //将springboot 应用启动
public static void main(String[] args) { SpringApplication.run(Springboot01HelloworldApplication.class, args);
} }
注解:
@SpringBootApplication:springboot的配置 @Configuration:spring配置类 @Component:说明这是一个spring的组件 @EnableAutoConfiguration:自动配置 @AutoConfigurationPackage:自动配置包 @Import({Registrar.class}):自动配置包注册 @Import({AutoConfigurationImportSelector.class}):自动配置导入选择 结论:springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功。
- springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
- 将这些自动配置的类导入容器,自动配置就会生效,帮我们进行自动配置。
- 以前我们需要自动配置的东西,现在springboot帮我们做了
- 整合JavaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0RELEASE。jar这个包下面
- 他会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器中;
- 容器中也会存在非常多的xxxAutoConfiguaratio的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件;并自动配置,@Configuration,JavaConfig
- 有了自动配置,免去了我们手动编写配置文件的工作!
五:关于springboot谈谈你的理解:
自动装配:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories
文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
个人认为:自动装配就是通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。
run():
了解一下主启动类是怎么运行;
主要做了4件事,
推断应用的类型是普通的项目还是web项目
查找并加载所有可用的初始化器,设置到initizers属性中
找出所有的应用程序监听器,设置到listener中
推断并设置main方法的定义类,找到运行的主类。
六:
yaml语法讲解:
springboot使用的厍配置文件是固定的,application.properties或者application.yml,最好用后者。
配置文件的作用:修改springboot自动配置的默认值,因为springboot在底层都给我们自动配置好了。
application.yaml文件:可以给实体类赋值
#k=v
#d对空格的要求非常高
#普通的key-value
name:lingdu
#对象
student:
name:lingdu
age:24
#行内写法
student:{name:ligndu,age:24}
#数组
pets:
- cat
- dag
- pig
实体类加注解变红需要加入一个依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
//这里是配置类的值跟配置文件绑定,用的是yaml
@ConfigurationProperties(prefix = "person")
@Component这个注解不能少
上面注解的作用:将配置文件中配置的每个属性的值,映射到这个组件中;
告诉springboot将本类中的所有属性和配置文件相关的配置进行绑定,
参数:prefix = "person" :将配置文件中person下面的所有属性一一对应,
只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能。
先编写实体类
再写yaml文件配置实体类
最后将实体类和文件映射。
七:JSR303效验:是写在实体类上面的
@Validated//数据校验
public class person {
@Email(message="格式输入错误")
private String name;
松散绑定:比如yaml中写last_name,实体类中是lastName,这个就是松散绑定。
这里遇到了一个问题:为什么无法导入依赖,原因是maven地址没有改,直接改掉,以后导入项目就是自己的默认地址了。
多种环境配置及配置文件位置:
有两种:
关于properties的,建立3个,标明名字,用的时候选择
关于yaml的,同一个文件夹中写多个,用的时候标明即可。
配置文件的优先级:
项目路径下的config文件夹配置文件
项目路径下配置文件
资源路径下的config文件夹配置文件
资源路径下配置文件
server:
port: 8081
spring:
profiles:
active: dev//这里是选择使用那个端口号的,如果这三段不写则默认使用8081端口。
---
server:
port: 8082
spring:
profiles: dev
---
server:
port: 8083
spring:
profiles: test
八:自动配置原理理解:需要细看
精髓:
springboot会加载大量的自动配置类
我们看我们需要的功能有没有在springboot默认写好的自动配置类当中;
我们再来看这个自动配置类中配置了哪些组件(只要我们要用的这些组件存在其中,我们就不需要再爱手动配置了)
给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们只需要在文件中指定这些属性的值即可。
看日志输出:debug=true,可以看自动配置哪些生效
九:thameleaf:模板引擎
首先导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
依赖导入错误可能会出现问题,找到这个依赖的文件夹直接删掉再从新下载一下就好了。
前端页面:这里加入了一个约束。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<div th:text="${msg}"></div>
</body>
</html>
templates:下面的资源需要通过controller来访问,
使用了模板引擎们可以将html放到templates目录。
十:扩展springmvc:
在springboot中,有非常多的xxxConfiguration帮组我们进行配置,只要看见了这个东西,破门就要注意了!
自定义视图解析器:
所有的东西都经过DispatherServlet
@Configuration
public class MyMvcconfig implements WebMvcConfigurer {
//ViewReolver 实现了视图解析器接口的类,我们就可以把它看做属兔解析器
@Bean
public ViewResolver myViewRsolver(){
return new MyViewReslver();
}
//自定义一个视图解析器,静态内部类
public static class MyViewReslver implements ViewResolver{
@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
}
十一:登录拦截器
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录成功之后,应该有用户的session
Object loginuser = request.getSession().getAttribute("loginuser");
if (loginuser == null) {
//没有登录,而是直接进入的首页,肯定是不让进的
request.setAttribute("msg", "没有权限,请先登录");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
return true;
}
}
}
添加拦截器:
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
//自定义的国际化组件就生效了
@Bean
public LocaleResolver localeResolver() {
return new MyLocaleResolver();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor())
.addPathPatterns("/**").excludePathPatterns("/index.html", "/", "/user/login", "/asserts/**");
}
}
十二:整合druid数据源
导入依赖:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
yaml文件配置:
spring:
datasource:
username: root
password: root
url: jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
# springboot默认是不注入这些属性值的,需要自己绑定
# druid数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Properity
#则导入log4j 依赖就行
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
控制层:
@RestController
public class JDBCController {
@Autowired
JdbcTemplate jdbcTemplate;
//查询数据库的所有信息
//没有实体类,怎么查询,用map
@GetMapping("/userList")
public List<Map<String,Object>> userList(){
String sql="select * from user";
List<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);
return maps;
}
}
@Configuration
public class DruidConfig {
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource(){
return new DruidDataSource();
}
//后台监控:web.xml ServletregisterationBean
//因为springboot内置了servlet容器,所以没有web.xml,替代方法:ServletRegisterationBean
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean<StatViewServlet> bean=new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
//后台需要有人登录,账号密码设置
HashMap<String, String> initParameters= new HashMap<>();
//增加配置
initParameters.put("loginUsername","admin");//登录的账号密码是固定的
initParameters.put("loginPassword","123456");
//允许谁可以访问
initParameters.put("allow","");
//禁止谁访问;
// initParameters.put("zhang","192.068.11.11");
bean.setInitParameters(initParameters);//设置初始化参数
return bean;
}
//filter
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//可以过滤哪些请求呢?
Map<String,String> initparameters=new HashMap<>();
//这些东西不进行统计
initparameters.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initparameters);
return bean;
}
}
十三:整合mybatis:
导入依赖:
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.0</version>
</dependency>
properties配置文件:
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.url=jdbc:mysql://localhost:3306/db4?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#整合mybatis
mybatis.type-aliases-package=com.zhang.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
##mybatis.configuration.lazy-load-trigger-methods=
mybatis配置;
//@Mapper
//@Repository //被spring整合
//public interface AccountMapper {
// //这个注解表示这是一个mybatis的Mapper类,相当于在.xml文件中绑定接口。
编写SQL