概念
Spring Boot的启动器实际上就是一个依赖。这个依赖中包含了整个这个技术的相关jar包,还包含了这个技术的自动配置,以前绝大多数XML配置都不需要配置了。
如果是Spring自己封装的启动器的artifact id名字满足:spring-boot-starter-xxxx,
如果是第三方公司提供的启动满足:xxxx-spring-boot-starter。
以后每次使用Spring Boot整合其他技术时首先需要考虑导入启动器。
Spring Boot版本介绍
- SNAPSHOT:快照版,即开发版。
- CURRENT:最新版,但是不一定是稳定版。
- GA:General Availability,正式发布的版本。
hello world
1.项目继承spring-boot-starter-parent
原因: spring-boot-starter-parent中规定了各种jar包版本,可以避免jar包版本冲突
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
如果已经有父工程了Spring Boot用了继承就不能继承别的项目了。所以Spring Boot还提供了依赖的方式。
使用dependencyManagement进行jar包版本管理
dependencyManagement可以在本项目和子项目中使用
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2.新建启动类
Spring Boot的启动类的作用是启动Spring Boot项目,是基于Main方法来运行的。
注意:启动类在启动时会做注解扫描(@Controller、@Service、@Repository…),扫描位置为同包或者子包下的注解,所以启动类的位置应放于包的根下。(扫描同一路径下的所有类的注解,注意是注解,xml文件不能扫描)
// 启动类
// 可以自动扫描当前类所在包及子包的注解
// 注意:此类要放入到包中
@SpringBootApplication
public class MyApplication {
public static void main(imagesString[] args) {
SpringApplication.run(MyApplication.class,args);
}
}
新建控制器
@Controller
public class DemoController {
@RequestMapping("/show")
@ResponseBody
public String show(){
return "hello";
}
}
Spring Boot配置文件
1.Properties格式
2.YML格式
如果同一个目录下,有application.yml也有application.properties,默认先读取application.properties。
如果同一个配置属性,在多个配置文件都配置了,默认使用第1个读取到的,后面读取的不覆盖前面读取到的。
注意:static该目录是SpringBoot可以直接识别的目录,会将其中的静态资源编译到web项目中,并放到tomcat中使用。静态资源的访问路径中无需声明static。例如: http://localhost:8080/a.png
IDEA中经常出现放在static下的静态文件即使重启也不被编译。需要通过Maven面板进行清空缓存,重新编译启动即可识别。
启动
访问localhost:8080/show
1.Spring Boot整合MyBatis
添加依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
yml中配置连接信息
# 数据源(数据库连接池) 配置
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: fsfs
# 加载MyBatis的mapper.xml
mybatis:
mapper-locations: classpath:mybatis/*.xml
创建service层,在Mapper报下所有接口加上@Mapper注解或在启动类上加@MapperScan(“接口路径”)
在serviceImp上加上@Service注解
调用执行
如果xml文件和Mapper接口在同一目录下springboot是扫描不到的
1.需要配置资源拷贝插件让xml能扫描到
2.同时还要配置yml中的mybatis的mapper映射路径:
1和2都要配置才行
1.mybatis映射路径
mybatis:
mapper-locations: classpath:com/example/demo/mapper/*.xml
2.资源拷贝插件
<build>
<resources>
<!-- 扫描src/main/java下所有xx.xml文件 -->
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<!-- 扫描resources下所有资源 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
2.Spring Boot整合Druid
添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.11</version>
</dependency>
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 连接池的配置信息
# 初始化大小,最小,最大
initial-size: 5
max-active: 30
min-idle: 5
# 配置获取连接等待超时的时间
max-wait: 60000
validation-query: SELECT 1 FROM DUAL
#配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
test-while-idle: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
# 配置DruidStatViewServlet
stat-view-servlet:
# 登录名
login-username: admin
# 登录密码
login-password: admin
url-pattern: /druid/*
# IP白名单(没有配置或者为空,则允许所有访问)
allow: 192.167.10.1,127.0.0.1
reset-enable: false
# 必须启用,要不会404
enabled: true
3.SpringBoot整合Junit4
添加启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
注意:
- 测试类不能叫做Test
- 测试方法必须是public
- 测试方法返回值必须是void
- 测试方法必须没有参数
测试
注意:在springBoot2.4之前 使用整合单元测试需要写 @SpringBootTest (classes={启动器类名.class})和RunWith(SpringRunner.class)
// 当前类为测试类
@SpringBootTest
public class MyTest {
@Autowired
UserMapper userMapper;
@Autowired
private UserService userService;
@Test
public void test(){
User user = userMapper.selectById(1L);
System.out.println(user);
System.out.println(userService.test());
}
}
4.Spring Boot整合PageHelper
Spring Boot整合PageHelper不需要做任何配置文件的配置,添加依赖后就可以直接使用。
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.2</version>
</dependency>
代码中一定要注意,要把PageHelper.startPage()写在查询数据库代码之上。
测试:
// pageNumber为当前页码 pageSize为页大小
PageHelper.startPage(pageNumber,pageSize);
// 查询全部,查询方法必须是查询多行结果,且没有分页语法。否则无法在sql后面拼接limit子句。
List<POJO> list = tbItemMapper.selectAll();
// PageInfo是分页查询所有查询结果封装的类,所有的结果都从这个类取
PageInfo<TbItem> pi = new PageInfo<>(list);
System.out.println(pi.getList());
System.out.println(pi.getTotal());
5.Spring Boot整合logback
Spring Boot默认使用Logback组件作为日志管理。Logback是由log4j创始人设计的一个开源日志组件。在Spring Boot项目中我们不需要额外的添加Logback的依赖,因为在spring-boot-starter或者spring-boot-starter-web中已经包含了Logback的依赖。
Logback读取配置文件的步骤:
1.在classpath下查找文件logback-test.xml
2.如果文件不存在,则在classpath下查找logback.xml
注意:我们可以通过yml配置方式开启日志, 这种不需要导入logback.xml
#不改变日志类型和日志规则 只开启mybatis中对应SQL的日志
logging:
level:
com.bjsxt.mapper: trace
6.SpringBoot异常处理
1.springBoot中异常处理页面
直接在 templates中新建文件夹名称error文件的名称就是异常的状态码―例如 500.html 5xx.html如果没有找到合适的异常跳转页面就会找templates中error.html
扩展名取决于使用的java模板引擎
设置具体的状态码页面
在templates下新建error文件夹,在error中新建:状态码.html的页面。例如当出现500时显示的页面为500.html/ftlh
使用x进行模糊匹配
当出现5开头状态码的错误时,显示页面可以命名为5xx.html
当出现50开头状态码的错误时,显示页面可以命名为50x.html
500.html >5xx.html > error.html
2.异常处理
在控制器类中添加一个方法,结合@ExceptionHandler。但是只能对当前控制器中方法出现异常进行解决。
@Controller
public class UsersController {
@RequestMapping("showInfo")
public String showInfo(){
String str = null;
str.length();
return "ok";
}
@ExceptionHandler(value = {java.lang.NullPointerException.class} )
public ModelAndView nullpointExcepitonHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("err",e.toString());
mv.setViewName("error1");
return mv;
}
}
通过@ControllerAdvice与@ExceptionHandler注解处理异常
/**
* 全局异常处理类
*/
@ControllerAdvice
public class GlobalException {
@ExceptionHandler(value = {java.lang.NullPointerException.class} )
public ModelAndView nullpointExcepitonHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("err",e.toString());
mv.setViewName("error1");
return mv;
}
@ExceptionHandler(value = {java.lang.ArithmeticException.class} )
public ModelAndView arithmeticExceptionHandler(Exception e){
ModelAndView mv = new ModelAndView();
mv.addObject("err",e.toString());
mv.setViewName("error2");
return mv;
}
}
3.通过SimpleMappingExceptionResolver对象处理异常
/**
* 全局异常
* SimpleMappingExceptionResolver
*/
@Configuration
public class GlobalException2 {
/**
* 此方法返回值必须是SimpleMappingExceptionResolver对象
* @return
*/
@Bean
public SimpleMappingExceptionResolver getSimpleMappingExceptionResolver(){
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
Properties properties = new Properties();
/*
* 参数一:异常类型,并且是全名
* 参数二:视图名称
*/
properties.put("java.lang.NullPointerException","error3");
properties.put("java.lang.ArithmeticException","error4");
resolver.setExceptionMappings(properties);
return resolver;
}
}
4. 通过自定义HandlerExceptionResolver对象处理异常
@Component
public class GlobalException3 implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception e) {
ModelAndView mv = new ModelAndView();
//判断不同异常类型,做不同视图的跳转
if(e instanceof NullPointerException){
mv.setViewName("error5");
}
if(e instanceof ArithmeticException){
mv.setViewName("error6");
}
mv.addObject("error",e.toString());
return mv;
}
}
7.Spring Boot中Bean管理
访问权限修饰符没有强制要求,一般是protected
返回值就是注入到Spring容器中实例类型。
方法名没有强制要求,相当于bean 中id属性。也就是bean的注入名称
如果bean中的类还有类对象,直接在@bean上加入另一个类的对象,可以使用@Qualifier(“”)指定别名
@Configuration
public class MyConfig {
@Bean
protected User jqk(){
User user = new User();
user.setId(1L);
user.setName("张三");
return user;
}
// 自定义bean名称
@Bean("nml")
protected User abc(){
User user = new User();
user.setId(2L);
user.setName("李四");
return user;
}
}
测试:
@SpringBootTest
public class test {
@Autowired
@Qualifier("jqk")
private User abc;
@Test
public void test(){
System.out.println(abc);
}
}
8.SpringBoot拦截器
创建实现拦截器的类
不要忘记类上注解@Component
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("pre");
return false;
}
}
注册拦截器
注意:
类上有注解@Configuration。此类相当于SpringMVC配置文件。也可以使用@SpringBootConfiguration
@SpringBootConfiguration
public class Myconfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
/注册拦截器,可以注册多个
registry.addInterceptor(myInterceptor).addPathPatterns("/*").excludePathPatterns("/login");
}
}
9.Spring Boot 开发者工具
开发者工具作用:
使用开发者工具包不需要重启。监听内容改变。
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
修改Registry
Ctrl+Shift+Alt+/ 点击弹出框中Registry…
重新服务器再次改变代码,服务器会自动监听启动
10.SpringBoot项目打包成jar包
添加SpringBoot打包插件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
点击IDEA右侧Maven – > Lifecycle --> install
打包后的内容出现在target根目录
运行jar包项目
java -jar 文件名.jar