目录
1、SpringBoot介绍
1.1 Spring优缺点
1.2 SpringBoot概述
1.2.1 SpringBoot解决了Spring缺点
1.2.2 SpringBoot特点
1.2.3 SpringBoot的核心功能
2、 SpringBoot快速入门
2.1 创建Maven工程
2.1.1 用idea工具创建一个maven工程
2.1.2 添加SpringBoot的启动器
2.1.3 编写SpringBoot引导类
2.1.4 编写Controller
2.1.5 测试
3 SpringBoot 深度体验
3.1 整合Spring Data JPA
3.1.1 添加Spring Data JPA启动器
3.1.2 添加数据库驱动依赖
3.1.3 创建数据库
3.1.4 创建配置文件
3.1.5 创建实体配置
3.1.6 编写UserDao
3.1.7 编写Controller
3.2 添加页面
3.2.1 添加freemarker的依赖
3.2.2 编写freemarker模板
3.2.3 访问静态资源
4 SpringBoot 的配置文件
4.1 SpringBoot配置文件类型
4.1.1 SpringBoot配置文件类型和作用
4.1.2 application.yml配置文件
4.1.3 SpringBoot 配置信息的查询
4.2 配置文件与配置类的属性映射方式
4.2.1 使用注解@Value映射
4.2.2 使用注解@ConfigurationProperties映射
5 SpringBoot整合其他技术
5.1 SpringBoot整合Mybatis
5.1.1 添加Mybatis的启动器
5.1.2 创建实体
5.1.3 编写Mapper
5.1.4 配置Mapper映射文件
5.1.5 在application.properties中添加mybatis的信息
5.1.6 编写测试Controller
5.1.7 测试
5.1.8 Mapper接口和映射文件在同一目录下
5.2 SpringBoot整合Junit
5.2.1 添加Junit的启动器
5.2.2 编写测试类
5.2.3 控制台打印信息
5.3 SpringBoot整合Redis
5.3.1 添加redis的起步依赖
5.3.2 配置redis的连接信息
5.3.3 注入RedisTemplate测试redis操作
5.4 SpringBoot整合ElasticSearch
5.4.1 添加ElasticSearch的启动器
5.4.2 配置文件
5.4.3 创建一个Entity
5.4.4 创建Repository
5.4.5 测试方法
5.4.6 同时整合redis和ElasticSearch时的问题
6 一些技巧
6.1 事务管理
6.2 Springboot的部署
6.3 使用idea快捷创建SpringBoot项目
(1)优点
为企业级Java开发提供了一种相对简单的方法,通过IoC实现的DI以及AOP编程,用简单的POJO实现了EJB功能
(2)缺点
Spring1.0、2.0XML配置
Spring3.0 注解配置
Spring4.0 注解以及Java源码配置
这些配置都消耗了开发的时间,降低了编码效率
项目的依赖管理以及版本不兼容问题都影响了开发效率
提供更快的开发体验
开箱即用,无需XML配置。同时,也可以修改默认值来自定义配置
还提供了一些非功能性特性,如嵌入式服务器、外部配置
不是对Spring的增强,而是提供了一种快速的访问模式
本质上是一个Maven项目对象模型,将具备某种功能的坐标打包在一起,并提供一种默认配置
项目运行时,根据条件决定用哪个Spring配置
NEW->Maven
SpringBoot要求,项目要继承SpringBoot的起步依赖spring-boot-starter-parent
指定实用的jdk版本
SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖
通过SpringBoot提供的引导类起步SpringBoot才可以进行访问
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class);
}
}
package com.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class QuickStartController {
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功!";
}
}
启动方式一:启动MySpringBootApplication类中的main方法
启动方式二:使用Maven命令spring-boot:run执行即可
控制台打印日志如下:
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.0.2.RELEASE)
2018-05-08 14:29:59.714 INFO 5672 --- [ main] com.itheima.MySpringBootApplication : Starting MySpringBootApplication on DESKTOP-RRUNFUH with PID 5672 (C:\Users\muzimoo\IdeaProjects\IdeaTest\springboot_quick\target\classes started by muzimoo in C:\Users\muzimoo\IdeaProjects\IdeaTest)
... ... ...
o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
2018-05-08 14:30:03.126 INFO 5672 --- [ main] o.s.j.e.a.AnnotationMBeanExporter : Registering beans for JMX exposure on startup
2018-05-08 14:30:03.196 INFO 5672 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2018-05-08 14:30:03.206 INFO 5672 --- [ main] com.itheima.MySpringBootApplication : Started MySpringBootApplication in 4.252 seconds (JVM running for 5.583)
通过日志发现,Tomcat started on port(s): 8080 (http) with context path ''
tomcat已经起步,端口监听8080,web应用的虚拟工程名称为空
打开浏览器访问url地址为:http://localhost:8080/quick
创建一个数据库,并在数据库中创建user表
- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`password` varchar(50) DEFAULT NULL,
`name` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', 'zhangsan', '123', '张三');
INSERT INTO `user` VALUES ('2', 'lisi', '123', '李四');
在maven工程的man/java/resources目录下创建名为“application.properties”的配置文件,其中配置数据库和jpa的相关属性
#DB Configuration:
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=root
#JPA Configuration:
spring.jpa.database=MySQL
spring.jpa.show-sql=true
spring.jpa.generate-ddl=true
@Entity
public class User {
// 主键
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
// 用户名
private String username;
// 密码
private String password;
// 姓名
private String name;
//此处省略setter和getter方法... ...
}
public interface UserDao extends JpaRepository
}
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/user/{id}")
private User getUserById(@PathVariable long id) {
User user = userService.getUserById(id);
return user;
}
}
Springboot中不推荐使用jsp。所以表现层页面可以使用模板引擎实现。Spring Boot支持的模板类型有: velocity、freemarker、Thymeleaf等 其中对velocity的支持以及设置成过期状态,也就意味中springboot已经抛弃的velocity,所以在springboot中如果要编写页面的话应该使用freemarker或者Thymeleaf,本教程中使用freemarker。
注意:模板必须放到src/main/resources/templates目录下。并且模板扩展名必须为ftl。
用户列表: border="1">
id
username
password
name
<#list userList as user>
${user.id}
${user.username}
${user.password}
${user.name}
</#list>
网页中可能会用到,图片、css、js等静态资源。
需要把静态资源放到src/main/resources下的static目录下
访问静态资源:
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml(application.yaml)进行配置。
SpringBoot默认会从Resources目录下加载application.properties或application.yml(application.yaml)文件
其中,application.properties文件是键值对类型的文件,之前一直在使用,所以此处不在对properties文件的格式进行阐述。除了properties文件外,SpringBoot还可以使用yml文件进行配置,下面对yml文件进行讲解。
4.1.2.1 yml配置文件简介
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。
YML文件的扩展名可以使用.yml或者.yaml。
4.1.2.2 配置文件语法
4.1.2.2.1 配置普通数据
注意:value之前有一个空格
4.1.2.2.2.配置对象数据
4.1.2.2.3 配置Map数据
person:
age: 23
name: qilong
4.1.2.2.4配置数组(List、Set)
上面提及过,SpringBoot的配置文件,主要的目的就是对配置信息进行修改的,但在配置时的key从哪里去查询呢?我们可以查阅SpringBoot的官方文档
文档URL:
https://docs.spring.io/spring-boot/docs/2.0.2.RELEASE/reference/htmlsingle/#common-application-properties
常用的配置摘抄如下:
# HTTP encoding (HttpEncodingProperties)
spring.http.encoding.charset=UTF-8 # Charset of HTTP requests and responses. Added to the "Content-Type" header if not set explicitly.
# JACKSON (JacksonProperties)
spring.jackson.date-format= # Date format string or a fully-qualified date format class name. For instance, `yyyy-MM-dd HH:mm:ss`.
# DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
spring.datasource.driver-class-name= # Fully qualified name of the JDBC driver. Auto-detected based on the URL by default.
spring.datasource.password= # Login password of the database.
spring.datasource.url= # JDBC URL of the database.
spring.datasource.username= # Login username of the database.
我们可以通过配置application.poperties 或者 application.yml 来修改SpringBoot的默认配置
例如:
application.properties文件
server.port=8888
server.servlet.context-path=demo
application.yml文件
server:
port: 8888
servlet:
context-path: /demo
我们可以通过@Value注解将配置文件中的值映射到一个Spring管理的Bean的字段上
例如:
application.properties配置如下:
person:
name: zhangsan
age: 18
或者,application.yml配置如下:
person:
name: zhangsan
age: 18
实体Bean代码如下:
@Controller
public class QuickStartController {
@Value("${person.name}")
private String name;
@Value("${person.age}")
private Integer age;
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功! name="+name+",age="+age;
}
}
浏览器访问地址:http://localhost:8080/quick 结果如下:
通过注解@ConfigurationProperties(prefix="配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射
application.properties配置如下:
person:
name: zhangsan
age: 18
或者,application.yml配置如下:
person:
name: zhangsan
age: 18
实体Bean代码如下:
@Controller
@ConfigurationProperties(prefix = "person")
public class QuickStartController {
private String name;
private Integer age;
@RequestMapping("/quick")
@ResponseBody
public String quick(){
return "springboot 访问成功! name="+name+",age="+age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(Integer age) {
this.age = age;
}
}
浏览器访问地址:http://localhost:8080/quick 结果如下:
注意:使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法
public class User {
// 主键
private Long id;
// 用户名
private String username;
// 密码
private String password;
// 姓名
private String name;
//此处省略getter和setter方法 .. ..
}
@Mapper
public interface UserMapper {
public List
}
注意:@Mapper标记该类是一个mybatis的mapper接口,可以被spring boot自动扫描到spring上下文中
在src\main\resources\mapper路径下加入UserMapper.xml配置文件"
version="1.0" encoding="utf-8" ?>
mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
id="queryUserList" resultType="user">
select * from user
#spring集成Mybatis环境
#pojo别名扫描包
mybatis.type-aliases-package=com.itheima.domain
#加载Mybatis映射文件
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
@Controller
public class MapperController {
@Autowired
private UserMapper userMapper;
@RequestMapping("/queryUser")
@ResponseBody
public List
List
return users;
}
}
此种情况下需要在maven的配置文件中添加如下信息:
并且无需在application.properties中配置mapper路径,只需要在引导类上添加@MapperScan注解即可
@SpringBootApplication
@MapperScan("com.itheima.mapper")
public class Application1 {
public static void main(String[] args) {
SpringApplication.run(Application1.class, args);
}
}
package com.itheima.test;
import com.itheima.MySpringBootApplication;
import com.itheima.domain.User;
import com.itheima.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MySpringBootApplication.class)
public class MapperTest {
@Autowired
private UserMapper userMapper;
@Test
public void test() {
List
System.out.println(users);
}
}
其中,SpringRunner继承自SpringJUnit4ClassRunner,使用哪一个Spring提供的测试测试引擎都可以
public final class SpringRunner extends SpringJUnit4ClassRunner
@SpringBootTest的属性指定的是引导类的字节码对象
#Redis
spring.redis.host=127.0.0.1
spring.redis.port=6379
@Autowired
private StringRedisTemplate redisTemplate;
@RequestMapping("/user/{id}")
@ResponseBody
private User getUserById(@PathVariable long id) throws Exception {
String json = redisTemplate.opsForValue().get("user:" + id);
if (json != null && !"".equals(json)) {
return objectMapper.readValue(json, User.class);
}
//User user = userService.getUserById(id);
User user = userMapper.getUserById(id);
redisTemplate.opsForValue().set("user:" + id, objectMapper.writeValueAsString(user));
return user;
}
#elasticsearch
spring:
data:
elasticsearch:
cluster-name: my-elasticsearch
cluster-nodes: 127.0.0.1:9300,127.0.0.1:9301,127.0.0.1:9302
@Document(indexName = "baseinfo", type = "user")
public class DUser {
@Id
@Field(type = FieldType.Integer, store = true)
private long id;
@Field(type = FieldType.Text, store = true, analyzer = "ik_max_word")
private String username;
@Field(type = FieldType.Text, store = true, analyzer = "ik_max_word")
private String password;
@Field(type = FieldType.Text, store = true, analyzer = "ik_max_word")
private String name;
//get、set...
}
public interface UserRepository extends ElasticsearchRepository
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application1.class)
public class ElasticSearchTest {
@Autowired
private UserRepository userRepository;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void createIndex() {
elasticsearchTemplate.createIndex(DUser.class);
elasticsearchTemplate.putMapping(DUser.class);
}
@Test
public void testUserRepository() {
DUser user = new DUser();
user.setId(1);
user.setUsername("zhangsan");
user.setPassword("123");
user.setName("张三");
userRepository.save(user);
}
}
Spring boot整合redis与elaticsearch时报错:
解决方法:
在运行参数中添加:
-Des.set.netty.runtime.available.processors=false
开启事务需要在引导类上添加@EnableTransactionManagement注解,启注解事务管理,等同于xml配置方式的
然后在使用事务的方法或者类上添加@Transactional注解开启事务。
Jar包是一个fat jar。其中包含项目要运行使用的所有的jar包。
第一步:在工程的pom.xml中添加以下依赖
第二步:可以直接使用maven的命令打成jar包。
mvn package
第三步:启动jar包。
>java -jar spring-boot-first-0.0.1-SNAPSHOT.jar
如果需要添加jvm启动参数例如:
>java -Des.set.netty.runtime.available.processors=false -jar springboot-first-1.0-SNAPSHOT.jar
通过idea快速创建的SpringBoot项目的pom.xml中已经导入了我们选择的web的起步依赖的坐标
version="1.0" encoding="UTF-8"?>
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
可以使用快速入门的方式创建Controller进行访问,此处不再赘述