您现在的位置是:首页 >技术交流 >SpringBoot网站首页技术交流

SpringBoot

在空中翱翔 2023-06-09 20:00:03
简介SpringBoot

1.Spring Boot简介

spring生态圈
在这里插入图片描述

1.1 什么是Spring Boot

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的初始搭建以及开发过程。使用springboot以后,搭建一个spring应用和开发变得很简单
该框架使用了特定的方式(继承starter,约定优先于配置)来进行配置,从而是开发人员不再需要定义样板的配置。通过这种方式,Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者
Spring Boot并不是一个框架,从根本上将,它就是一些maven库的集合,maven或者gradle项目导入相应依赖即可使用Spring Boot,而且无需自行管理这些库的版本
SpringBoot就是一些写好了maven的模块,我们在使用Spring就不需要以传统的方式来用,只需要以maven导入相应的springboot模块,就能完成一大堆操作。简单的说,它使用maven的方式对Spring应用开发进行进一步封装和简化

1.2 为什么要使用Spring Boot

Spring Boot是为简化Spring项目配置而生,使用它使得jar依赖管理以及应用编译和部署更为简单。Spring Boot提供自动化配置,使用Spring Boot,你只需编写必要的代码和配置必须得属性
使用Spring Boot,只需20行左右的代码即可生成一个基本的Spring Web应用,并且内置了tomcat,构建的fat Jar包通过Java -jar就可以直接运行
如上特性使用Spring Boot非常契合微服务的概念,可以结合Spring Boot与Spring Cloud和Docker技术来构建微服务并部署到云端
一个可执行jar即为一个独立服务很容易加载到容器,每个服务可以在自己的容器(例如docker)中运行
通过一个脚本就可以实现配置与部署,很适合运毒那部署,并且自动扩展也很容易
简单而言,即Spring Boot使编码更简单,使配置更简单,使部署更简单,使监控更简单
SpringBoot就是为了简化spring应用搭建,开发,部署,监控的开发工具

1.3 Spring Boot提供哪些功能

就是一些maven模块,我们需要知道有哪些模块,什么时候该导入什么模块

1.3.1 无需手动管理依赖jar包的版本

Spring Boot通过spring boot starter项目管理其提供的所有依赖的版本,当升级spring boot时,这些依赖的版本也会随之升级。个人无需指定版本号
但是也可以自定义版本号覆盖springboot的默认值。每个版本的boot都有对应的base spring version,不建议明确地指定spring版本。
例如,使用maven使,只需简单的在pom中包含spring-boot-starter-web即引入了Spring MVC和Tomcat的依赖
下面是Spring Boot在org.springframework.boot组下提供的一些Starters:

名称描述
spring-boot-starter核心Spring Boot starter,包括自动配置支持,日志和YAML
spring-boot-starter-actuator生产准备的特性,用于帮你监控和管理应用
spring-boot-starter-web对全栈web开发的支持,包括Tomcat和spring-webmvc
spring-boot-starter-aop对面向切面编程的支持,包括spring-aop和AspectJ
spring-boot-starter-data-jpa对“Java持久化API”的支持,包括spring-data-jpa,spring-orm和Hibernate
spring-boot-starter-jdbc对JDBC数据库的支持
spring-boot-starter-security对spring-security的支持

spring-boot-starter-web:web支持,其实就是springmvc简化使用
Spring-boot-starter-jdbc:springboot对jdbc支持
Spring-boot-starter-data jpa:springboot对data jpa支持
Spring-boot-starter-mybatis:springboot对mybatis支持
Spring-boot-starter-test:springboot对test支持
总之springboot就是简化spring应用开发,对web,service,dao层都支持

2.Spring Boot入门

2.1 环境要求

开发环境JDK1.8
项目管理工具(Maven)
开发工具(Eclipse/idea)

2.2 入门

2.2.1 创建Maven项目

在这里插入图片描述

2.2.2 导入Spring Boot依赖

<!-- 
	spring boot 父节点依赖,引入这个之后相关的引入就不需要添加version配置,spring boot会自动选择最合适的版本进行添加。
 -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.1.8.RELEASE</version>
</parent>
<properties>
	<java.version>1.8</java.version>
</properties>

<!--
	添加spring-boot-starter-web依赖(在01_hello模块中)
-->
<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2.3 编译测试

新建一个Controller类

@Controller
@RequestMapping("/hello")
public class HelloController {
	@RequestMapping("/hi1")
	@ResponseBody //直接作为字符串返回而不是页面地址
	public String sayHello(String name) {
		return name + "多对多   say hello 嘎嘎1和返回和返回哈哈发挥发挥!";
	}
	@RequestMapping("/hi2")
    @ResponseBody //直接作为字符串返回而不是页面地址
    public String sayHello2(String name){
        return name +" 多对多   say hello 嘎嘎1和返回和返回哈哈发挥发挥!";
    }
}

2.2.4 新建启动类(App - Main方法)

@SpringBootApplication//标识该应用为springboot的应用
public class HelloApplication {
	//一 传统开发springweb项目怎么干的?
    // 1 启动外部tomcat
    // 2 根据web.xml中配置信息初始化一个spring容器(applicationContext)
    // 3 做了一些常规配置后还会根据扫描包路径扫描一些bean(dao,service,controller)
    public static void main(String[] args) {
		//启动springboot应用
        // 1 启动了一个内置tomcat
        // 2 初始化一个spring容器
        // 3 自动配置(springmvc),扫描加了@SpringBootApplication类的当前包及其子子孙孙里面所有spring注解(@Repository @service @controller)
        //并且把扫描到的类纳入Spring管理
        SpringApplication.run(HelloApplication.class);
	}
}

2.2.5 热部署

即使修改了输出内容也要重启APP,非常麻烦!可以使用spring-boot-devtools来实现热部署
(1)介绍
spring-boot-devtools 是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去。原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后再启动还要更快,更快指的不是节省出来的手工操作的时间。
其深层原理是使用了两个ClassLoader,一个Classloader加载那些不会改变的类(第三方Jar包),另一个ClassLoader加载会更改的类(自己写的),称为 restart ClassLoader
,这样在有代码更改的时候,原来的restart ClassLoader 被丢弃,重新创建一个restart ClassLoader,由于需要加载的类相比较少,所以实现了较快的重启时间(5秒以内)
(2)使用
添加依赖包

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-devtools</artifactId>
	<optional>true</optional>
	<scope>true</scope>
</dependency>

添加spring-boot-maven-plugin到boot_web中:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

在idea中需要手动编译一下,ctrl+F9最好用下面这种方式解决热部署
在这里插入图片描述
在这里插入图片描述

3.Spring Boot Web

3.1 引入

前面我们使用Spring Boot能往浏览器中输出一个字符串!实际上我们需要的是跳转到一个页面或者获取一个Json数据。那怎么实现呢?

3.2 Freemaker支持

3.2.1 基本环境搭建

maven项目(web-app)
导入jar

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
</dependencies>

3.2.2 配置application.properties

# FreeeMarker 模板引擎配置
spring.freemarker.allow-request-override=false
spring.freemarker.cache=false
spring.freemarker.check-template-location=true
spring.freemarker.charset=UTF-8
spring.freemarker.content-type=text/html
spring.freemarker.expose-request-attributes=false
spring.freemarker.expose-session-attributes=false
spring.freemarker.expose-spring-macro-helpers=false

3.2.3 Controller

@Controller
public class IndexController {
    @RequestMapping("/index")
    public String index(Model model){
        model.addAttribute("message", "呵呵!");
        return "index";
    }
}

3.2.4 模块

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org"
             xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
	<head>
		<title>Hello World!</title>
	</head>
	<body>
		<h1>Hello,${message}</h1>
	</body>
</html>

3.3 获取Json数据

3.3.1 导入依赖包

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

 <!-- servlet 依赖. -->
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<scope>provided</scope>
</dependency>
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>jstl</artifactId>
</dependency>

3.3.2 建立domain里的实体类

public class Person {
	private Long id;
	private String name;
	private Date birthDay;
	
	public Long getId()	{
		return id;
	}
	public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
	
	@JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "GMT+8")
    public Date getBirthDay() {
        return birthDay;
    }

    public void setBirthDay(Date birthDay) {
        this.birthDay = birthDay;
    }

	public Person(Long id, String name, Date birthDay) {
        this.id = id;
        this.name = name;
        this.birthDay = birthDay;
     }
}

3.3.3 编写测试类控制器

package cn.itsource.springboot.controller;

import cn.itsource.springboot.domain.Person;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Controller
@RequestMapping("/json1")
public class JsonController {
	//字符串
    @RequestMapping("/str")
    @ResponseBody
    public String json1(){
        return "yhptest";
    }
    //对象-日期
    @RequestMapping("/obj")
    @ResponseBody
    public Person json2(){
        return new Person(1L,"yhptest",new Date());
    }
    //数组
    @RequestMapping("/array")
    @ResponseBody
    public List<Person> json3(){
        return Arrays.asList(new Person(1L,"yhptest",new Date())
                ,new Person(2L,"yaohuaipeng",new Date()));
    }
}

4.SpringBoot配置

4.1 YAML

Springboot除了支持properties的配置,还支持yaml,而且企业中也是用的最多的

4.1.1 YAML是什么

YAML是YAML Ain’t Markup Language递归缩写,是YAML不是标记语言的意思,读音“yamel”(或者“雅梅尔”)。YAML是便于人阅读基于unicode编码的各种语言的序列号标准。它的用途广泛,用于配置文件,日志文件,跨语言数据共享,对象持久化,复杂的数据结构

4.1.2 原则与语法

原则:
1.大小写敏感
2.使用缩进表示层级关系
3.缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级
4.使用#表示注释
5.字符串可以不用引号标注
语法:
1.map,散列表
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个map,示例:

# YAML表示
age : 12
name : huang

# 对应的Json表示
{'age':12,'name':'huang'}

2.list,数组
使用连字符(-)表示

# YAML表示
- a
- b
- 12

# 对应Json表示
['a','b',12]

3.相互嵌套

-
	id : 1
	name : huang
-
	id : 2
	name : liao

# 对应Json表示
[{ id : 1,name : 'huang' },{ id : 2,name : liao' }]

4.1.3 案例实战

server:
	port: 9000
spring:
	freemarker:
		allow-request-override: false
		cache: false
		check-template-location: true
		charset: utf-8
		content-type: text/html
		expose-request-attributes: false
		expose-spring-macro-helpers: false
		expose-session-attributes: false

4.2 SpringBoot运行方式

4.2.1 在idea中直接通过main函数启动

开发时候

4.2.2 jar运行

项目上线java-jar xxx.jar 只依赖jdk
打包:

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

cmd窗口
mvn clean package spring-boot:repackage
运行:
java -jar xxx.jar

4.3 Spring Profiles多环境支持

4.3.1 是什么

Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只在特定的环境下生效

测试

开发

产品

配置多个环境
运行时执行特定环境

4.3.2 实现

(1)多环境
我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml
默认使用application.properties/yml的配置

server:
	port: 8081
spring:
	profiles:
		active: prod
---
server:
	port: 8083
spring:
	profiles: dev
---
server:
	port: 8084
spring:
	profiles: prod #指定属于哪个环境

(2)激活指定profile
1.在配置文件中指定 spring.profiles.active=dev
2.2、命令行:java -jar -Dspring.profiles.active=dev
spring-boot-02-config-0.0.1-SNAPSHOT.jar

5.SpringBoot测试

5.1 导入spring-boot-starter-test

在原有基础上面导入spring-boot-starter-test

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- web支持: 1、web mvc; 2、restful; 3、jackjson支持; 4、aop ........ -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-test</artifactId>
</dependency>

5.2 创建一个SpringBoot应用,并在下面创建一个Bean

@SpringBootApplication
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class,args);
	}
}

5.3 写SpringBoot测试从Springboot中获取bean就ok

@RunWith(SpringRunner.class)
@SpringBootTest(classes = App.class) //这事一个Spring测试,要告诉它在哪儿加载Spring配置文件,其实告诉它应用类型就ok
public class SpringbootTest {
	@Autowired
	private TestService testService;
	@Test
	public void test() throws Exception {
		System.out.println(testService);
		testService.test();
	}
}

6.集成三层结构

Service :Spring来做事务管理
Web:Spring MVC
DAO:各种持久化技术-jdbc,mybatis.spring data jpa
Spring集中集中管理
1).搭建三层结构-不要考虑持久化层,打印即可,当然暂时不要事务
2). dao+service+junit+controller+jsp/js/css

7.Spring Boot持久化

7.1 引入

Spring Boot就数据库持久化支持,支持原生Jdbc,也支持Mybatis和JPA

7.2 Spring Boot JdbcTemplate

引入spring-boot-starter-jdbc
那么只需要在需要使用的类中加入:
@Resource
private JdbcTemplate jdbcTemplate;

7.2.1 引入Maven依赖mysql,jdbc

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

7.2.2 数据库信息配置

在application.properties文件中配置mysql连接配置文件
###datasource
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

7.2.3 编写代码测试

(1).Dao

@Repository
public class UserDaoImpl implements IUserDao {
	@Autowired
    private JdbcTemplate jdbcTemplate;
    @Override
    public void save(User user)	{
		//添加
        jdbcTemplate.update("insert into user(username,password) values(?,?)",user.getName(),user.getPassword());
	}
}

(2).Service

@Service
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//类级别是只读事务
public class UserServiceImpl implements IUserService {
	@Autowired
    private IUserDao userDao;
    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    //@Transactional 后两个配置是默认值
    @Override
    public void add(User user) {
        userDao.save(user);
       // int i = 1/0;
    }
}

(3).Controller

@Resource
private DemoService demoService;
@RequestMapping("/getById")
public Demo getById(long id){
	return demoService.getById(id);
}

7.2.4 Spring Boot注解事务

声明式(xml): 配置事务管理器 配置通知 配置切面(切入后要应用通知)

<!-- 配置事物管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	<property name="dataSource" ref="dataSource" />
</bean>
<!-- aop应用事务管理 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
	<tx:attributes>
		<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
		<tx:method name="get*" read-only="true"/>
		<tx:method name="select*" read-only="true"/>
		<tx:method name="search*" read-only="true"/>
		<tx:method name="query*" read-only="true"/>
		<tx:method name="*" propagation="REQUIRED" read-only="true"/>
	<tx:attributes>
</tx:advice>
<aop:config>
	<aop:pointcut expression="execution(*cn.itsource.eloan.core.service..*.*(..))" id="coreServicePointcut"/>
	<aop:advisor advice-ref="txAdvice" pointcut-ref="coreServicePointcut"/>
</aop:config>

原来实现:
1)事务管理器
2)开启注解,就是能够识别@Transactional
3)在要控制事务的Service的或方法上面加上@Transactional
建议:类级别为只读事务,需要写事务的方法上面加写事务
SpringBoot:注解式事务
所有配置springboot都已经实现了,只需打注解即可

7.3 Spring Boot-mybatis

7.3.1 集成Mybatis

(1)新建maven project;
新建一个maven project,取名为:spring-boot-mybatis
(2)在pom.xml文件中引入相关依赖;
2.1 基本依赖,jdk版本号;
2.2 mysql驱动,mybatis依赖包,mysql分页PageHelper:

<dependency>
	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

<!-- mysql 数据库驱动. -->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- 	
		spring-boot mybatis依赖:
		请不要使用1.0.0版本,因为还不支持拦截器插件,
		1.1.1 是博主写帖子时候的版本,大家使用最新版本即可
-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>1.1.1</version>
</dependency>

<!-- 
    	MyBatis提供了拦截器接口,我们可以实现自己的拦截器,
    	将其作为一个plugin装入到SqlSessionFactory中。 
		Github上有位开发者写了一个分页插件,我觉得使用起来还可以,挺方便的。 
		Github项目地址: https://github.com/pagehelper/Mybatis-PageHelper
 -->
 <dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
	<version>4.1.0</version>
</dependency>

(3)。创建启动类App.java

@SpringBootApplication
@MapperScan("cn.itsource.springboot.mybatis.mapper")
public class App {
	public static void main(String[] args) {
		SpringApplication.run(App.class, args);
	}
	//这里和以往不一样的地方就是MapperScan的注解,这个是会扫描该包下的接口
}

(4).在application.properties添加配置文件

spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = root
spring.datasource.password = root
spring.datasource.driverClassName = com.mysql.jdbc.Driver
spring.datasource.max-active=20
spring.datasource.max-idle=8
spring.datasource.min-idle=8
spring.datasource.initial-size=10

(5).编写Demo测试类

public class Demo {
	private long id;
	private String name;
    //省略getter and setter…
}

(6).编写DemoMapper

public interface DemoMappper {
	@Select("select *from Demo where name = #{name}")
	public List<Demo> likeName(String name);
	
	@Select("select *from Demo where id = #{id}")
	public Demo getById(long id);
	
	@Select("select name from Demo where id = #{id}")
	public String getNameById(long id);
}

(7).编写DemoService

@Service
public class DemoService {
	@Autowired
	private DemoMappper demoMappper;
	
    public List<Demo> likeName(String name){
        return demoMappper.likeName(name);
    }
}

(8).编写DemoController

@RestController
public class DemoController {
	@Autowired
	private DemoService demoService;
	
	@RequestMapping("/likeName")
	public List<Demo> likeName(String name){
		return demoService.likeName(name);
	}
}

7.3.2 使用PageHelper分页

PageHelper是mybatis一个插件,可以用它完成分页

@Configuration
public class MyBatisConfiguration {
	@Bean
    public PageHelper pageHelper() {
		System.out.println("MyBatisConfiguration.pageHelper()");
        PageHelper pageHelper = new PageHelper();
        Properties p = new Properties();
        p.setProperty("offsetAsPageNum", "true");
        p.setProperty("rowBoundsWithCount", "true");
        p.setProperty("reasonable", "true");
        pageHelper.setProperties(p);
        return pageHelper;
    }
}

测试

@RequestMapping("/likeName")
public List<Demo> likeName(String name){
		 PageHelper.startPage(1,1);
	     return demoService.likeName(name);
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。