本文来自于千锋教育在阿里云开发者社区学习中心上线课程《SpringBoot实战教程》,主讲人杨红艳,点击查看视频内容。
本课程包含了SpringBoot的基本使用及SpringBoot如何和各项技术整合,快速学习到 SpringBoot 整合其他技术,熟练使用 SpringBoot。
随着动态语言的流行(Ruby,Groovy,Scala,Node.js),Java的开发显得格外的笨重:繁多的配置,低下的开发效率,复杂的部署流程以及第三方技术集成难度大。在上述环境下,SpringBoot应运而生。它使用“习惯由于配置”的理念让项目快速运行起来。使用SpringBoot很容易创建一个独立运行(运行jar,内嵌Servlet容器)准生产级别的基于Spring框架的项目,使用SpringBoot可以不用或只需要很少的Spring配置。
第一节:SpringBoot 入门程序
SpringBoot核心特点:
- 可以以jar包的形式独立运行,运行一个SpringBoot项目只需通过 java -jar xx.jar来运行
- 内嵌Servlet容器,SpringBoot可以选择Tomcat,Jetty或者Undertow,这样我们无须以war包形式部署项目
- 简化Maven配置,SpringBoot提供了一系列的starter pom 来简化Maven的依赖加载
- SpringBoot会根据在类路径中的jar包,类,为jar包中的类自动配置Bean,这样就极大的减少了我们要使用的配置
- ......
第二节:超全!默认全局配置文件都在这啦!
SpringBoot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录下或者类路径下的/config下,一般我们放到resources下。
默认的配置很多,使用的时候查找即可:
# BANNER
banner.charset=UTF-8 # Banner file encoding.
banner.location=classpath:banner.txt # Banner file location.
banner.image.location=classpath:banner.gif # Banner image file location (jpg/png can also be used).
banner.image.width= # Width of the banner image in chars (default 76)
banner.image.height= # Height of the banner image in chars (default based on image height)
banner.image.margin= # Left hand image margin in chars (default 2)
banner.image.invert= # If images should be inverted for dark terminal themes (default false)
......
第三节:3个经典场景配置
1、SpringBoot为我们提供了企业级开发绝大多数场景的starter pom,只要使用了应用场景所需的starter pom,相关的技术配置将会消除,就可以得到SpringBoot为我们提供的自动配置的Bean。
2、在SpringBoot中如何获取自定义的值?
使用@Value(“${book.author}”)
获取自定义属性的值。
3、SpringBoot还提供了基于类型安全的配置方式,通过@ConfigurationProperties将properties中的属性和一个Bean的属性关联,从而实现类型安全的配置。
第四节:自动配置的原理详解
既然SpringBoot可以在根据可依赖的架包进行自动配置,说明在项目启动的时候进行了配置。
SpringBoot自动配置的原理就是读取了文件中的类,根据属性使用默认值。
点击学习更多>>
第五节:不再做重复工作!创建父工程搞定
在创建每个SpringBoot前,都需要父级依赖。显然很麻烦,那么能不能不做父级依赖?我们自己创建父级依赖,这个父级工程对jar包进行管理,那么子工程就不用每一个进行父级依赖了。
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.5.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
子工程如何实现父级依赖呢?
第六节:玩转SpringBootApplication注解
应该把启动方法放在一个单独的类当中,这个类就称为启动类。
@EnableAutoConfiguration
@ComponentScan("com.qianfeng.controller")
public class SpringController {
public static void main(String[] args) {
SpringApplication.run(SpringController.class, args);
}
}
另外还有一个注解,该注解是一个组合注解,可以替代启动类的两个注解。
@SpringBootApplication //组合注解
第七节:一文了解SpringBoot的日志管理
SprongBoot使用的默认日志框架是Logback,并用INFO级别输出到控制台。
日志输出内容元素具体如下:
- 时间日期:精确到毫秒
- 日志级别:ERROR, WARN, INFO, DEBUG or TRACE
- 进程ID
- 分隔符:— 标识实际日志的开始
- 线程名:方括号括起来(可能会截断控制台输出)
- Logger名:通常使用源代码的类名
- 日志内容
第八节:2种loger的使用
第一种:带有loger的配置,不指定级别,不指定appender
< logger name="com.qianfeng.controller" />
第二种:带有多个loger的配置,指定级别,指定appender
<logger name="com.qianfeng.controller.SpringController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
第九节:不同环境下如何输出不同日志
根据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出,在 logback-spring.xml中使用 springProfile 节点来定义,方法如下:
<!-- 测试环境+开发环境. 多个使用逗号隔开-->
<springProfile name="test,dev">
<logger name="com.qianfeng.controller" level="info" />
</springProfile>
<!-- 生产环境-->
<springProfile name="prod">
<logger name="com.qianfeng.controller" level="ERROR" />
</springProfile>
在application.properties文件中指明使用哪一种:
spring.profiles.active=prod
第十节:还在手动操作?试试配置为开发模式
大家会发现每次对代码进行了修改之后,都需要手动的进行启动,这样很麻烦。所以我们可以把工程设置为开发模式,就不需要这样麻烦了。设置开发模式之后,需要加入两个依赖:
<!-- 加入以下依赖,代码做了修改,不用重新运行 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>springloaded</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId> </dependency>
第十一节:详解访问静态资源
在SpringBoot中加载静态资源和在普通的web应用中不太一样。默认情况下,Spring Boot从classpath的/static,/public或/META-INF/resources文件夹或从ServletContext根目录提供静态内容。
如果想自己配置,我们需要在全局配置当中,覆盖默认配置:
其对应属性为:
spring.resources.static-locations=classpath:/static/
第十二节:如何解析Json数据
SpringBoot默认配置的是Jackson。
自定义使用FastJson解析Json数据,添加依赖:
<!-- fastjson的依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.15</version>
</dependency>
配置FastJson有两种方式:
第一种:让启动类继承WebMvcConfigurerAdapter
......
第十三节:定义全局异常处理器
SpringBoot使用AOP思想进行全局异常处理
异常通常作为一个通知介入的,所以说我们需要用到注解。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
@ResponseBody
public Map<String,Object> allExceptionHandler(
Exception exception) throws Exception
{
Map<String,Object> map = new HashMap<String,Object>();
map.put("errorCode", 500);
map.put("errorMsg", exception.toString());
return map;
}
}
第十四节:异步调用实现多线程处理任务
在项目中,当访问其它接口较慢或者做耗时任务时,不想程序一直卡在耗时任务上,想程序能够并行执行,我们可以使用多线程来并行的处理任务,SpringBoot提供了异步处理方式@Async。
第十五节:官方推荐!SpringBoot这样整合JSP
Spring Boot官方不推荐使用jsp,因为jsp相对于一些模板引擎,性能都比较低,官方推荐使用thymeleaf。
springboot整合jsp,必须是war工程。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
第十六节:详解SpringBoot整合Freemarker
springboot不建议使用jsp,使用模板引擎,比如themleaf,velocity,freemarker整合freemarker 。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第十七节:SpringBoot整合Thymeleaf
SpringBoot官方是不推荐jsp页面的,推荐的是模板引擎。Thymeleaf是其中一种模板引擎。SpringBoot如何整合Thymeleaf:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
第十八节:SpringBoot整合QuartZ
QuartZ是一个任务调度框架,我们以实现每隔一秒打印一下时间为例:
//任务
@Component
public class MyJob {
@Scheduled(fixedRate=1000)
public void run()
{
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
}
第十九节:SpringBoot中如何使用JdbcTemplate?
我们通过新增数据库表中的用户来实现SpringBoot中如何使用JdbcTemplate。
<!-- springboot整合jdbctemplate -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- mysql的依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二十节:SpringBoot中如何使用xml方式整合Mybatis?
通过实现对数据库表中添加用户以及分页查找用户来实现SpringBoot中如何使用xml方式整合Mybatis。
添加mybatis、MySQL、druid数据库连接池、分页依赖:
<!-- springboot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.11</version>
</dependency>
<!-- 分页插件 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.1.2</version>
</dependency>
<!-- @Param注解在该包中 -->
<dependency>
<groupId>org.apache.ibatis</groupId>
<artifactId>ibatis-core</artifactId>
<version>3.0</version>
</dependency>
第二十一节:SpringBoot中如何使用注解方式整合Mybatis?
通过实现查找用户和添加用户,来解析SpringBoot中如何使用注解方式去整合Mybatis。
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
@Override
public Users findUser(String name) {
return usersMapper.findUserByName(name);
}
@Override
public void saveUser(Users user) {
usersMapper.addUser(user.getName(), user.getPassword());
}
}
第二十二节:如何区分多数据源?
在项目中,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源。
如何区分多个数据源:
- 通过包来区分:com.db1.mapper、com.db2.mapper
- 使用注解来区分:需要用到大量的注解,一般不推荐使用。
第二十三节:SpringBoot的事务管理
在SpringBoot中可以使用xml配置文件的方式或者注解的方式来声明事务。
在Spring Boot中推荐使用@Transactional注解来声明事务。
当我们使用了spring-boot-starter-jdbc或spring-boot-starter-data-jpa依赖的时候,SpringBoot会自动默认分别注入DataSourceTransactionManager或JpaTransactionManager。
第二十四节:SpringBoot如何整合JPA-Hibernate?
通过实现数据库表中添加、查找、删除用户的功能来详解SpringBoot如何整合JPA-Hibernate。
<!-- springboot整合jpa -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
第二十五节:如何在SpringBoot中实现邮件的发送?
获取发件人的邮箱:
@Component
public class EmailConfig {
@Value("${spring.mail.username}")
private String emailFrom;
public String getEmailFrom() {
return emailFrom;
}
public void setEmailFrom(String emailFrom) {
this.emailFrom = emailFrom;
}
}
第二十六节:如何实现发送带附件的邮件?
发送带附件的邮件:
void sendAttachmentMail(String sendTo, String title, String content, File file);
第二十七节:如何发送基于模板的邮件?
模板:使用一些相同的模板,但里面的数据是可以变化的。
添加模板引擎依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第二十八节:SpringBoot实现文件上传
实现上传页面:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"></meta>
<title>文件上传</title>
</head>
<body>
<h2>文件上传</h2>
<hr/>
<form method = "POST" enctype="multipart/form-data" action="/upload">
<p>
文件<input type="file" name="file"/>
</p>
<p>
<input type="submit" value="上传"/>
</p>
</form>
</body>
</html>
第二十九节:SpringBoot实现批量文件上传
批量上传需要利用for循环实现:
//创建文件在服务器端的存放路径
String dir=request.getServletContext().getRealPath("/upload");
File fileDir = new File(dir);
if(!fileDir.exists())
fileDir.mkdirs();
//生成文件在服务器端存放的名字
for(int i = 0;i<file.length;i++) {
String fileSuffix=file[i].getOriginalFilename().substring(file[i].getOriginalFilename().lastIndexOf("."));
String fileName=UUID.randomUUID().toString()+fileSuffix;
File files = new File(fileDir+"/"+fileName);
//上传
file[i].transferTO(files);
}
第三十节:什么是Neo4J?
Neo4j是一个高性能的,NOSQL图形数据库,它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
第三十一节:SpringBoot如何整合Neo4j?
添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
在全局配置文件application.properties中添加:
spring.data.neo4j.uri=http://localhost:7474
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123
第三十二节:SpringBoot如何整合Redis(单机版)?
在程序之中Redis缓存如何使用:
首先开启缓存,在启动类中添加
@EnableCaching //开启缓存
第三十三节:SpringBoot如何整合Redis集群?
添加集群配置:
spring.redis.cluster.nodes=192.168.25.128:7550, 192.168.25.128:7551, 192.168.25.128:7552, 192.168.25.128:7553, 192.168.25.128:7554, 192.168.25.128:7555
第三十四节:SpringBoot如何集成MongoDB?
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
第三十五节:SpringBoot怎样整合ActiveMQ?
ActiveMQ是符合JMS规范的消息管理者。
<!-- 整合ActiveMQ的依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
第三十六节:SpringBoot怎样整合RabbitMQ?
通过SpringBoot集成RabbitMQ实现消息的发送,接收。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
第三十七节:Kafka概述及安装
Apache Kafka是一个分布式发布 - 订阅消息系统和一个强大的队列,可以处理大量的数据,并使您能够将消息从一个端点传递到另一个端点。 Kafka适合离线和在线消息消费。 Kafka消息保留在磁盘上,并在群集内复制以防止数据丢失。 Kafka构建在ZooKeeper同步服务之上。 它与Apache Storm和Spark非常好地集成,用于实时流式数据分析。
第三十八节:SpringBoot如何实现Solr?
添加依赖:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-solr</artifactId>
</dependency>
全局配置:
spring.data.solr.host=http://192.168.25.129:8080/solr
第三十九节:ElasticSearch概述及安装
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
第四十节:SpringBoot如何整合ElasticSearch?
添加相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
application.yml全局配置:
spring:
data:
elasticsearch:
cluster-nodes: 192.168.25.129:9300
local: false
repositories:
enabled: true
第四十一节:SpringBoot如何整合WebSocket?
WebSocket 连接允许客户端和服务器之间进行全双工通信,以便任一方都可以通过建立的连接将数据推送到另一端。WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
第四十二节:SpringBoot如何整合AngularJS?
SpringBoot整合AngularJS实现数据库表页面的增删改查。
添加相关依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>1.9.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>
</dependency>