SpringBoot从零到上线
SpringBoot精要
SpringBoot的四个核心
1.自动配置:针对很多Spring应用程序常见的应用功能,SpringBoot能自动提供相关配置。
在任何Spring应用程序的源代码中,都可以找到java配置或XML配置,他们为应用程序开启了特定的特性和功能。
2.起步依赖:告诉SpringBoot需要什么功能,他就能引入需要的库。
SpringBoot起步依赖基本都以spring-boot-starter打头,随后是直接代表其功能的名字,比如web、test。
3.命令行界面:这是SpringBoot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。
4.Actuator:让你能够深入运行中的SpringBoot应用程序,一探究竟。
Spring应用程序上下文里配置的Bean
SpringBoot的自动配置做的决策
应用程序取到的环境变量、系统属性、配置属性和命令行参数
应用程序里线程的当前状态
应用程序最近处理过的HTTP请求的追踪情况
各种和内存用量、垃圾回收、Web请求以及数据源用量的相关指标
SpringBoot不是什么
SpringBoot不是应用服务器
SpringBoot可以把Web应用程序变为可自执行的JAR文件,不用部署到传统Java应用服务器里就能在命令行里运行。SpringBoot在应用程序里嵌入了一个Servlet容器(tomcat、Jetty或Undertow),以此实现这一功能。但这是内嵌的Servlet容器提供的功能,不是SpringBoot实现的。
SpringBoot没有引入任何形式的代码生成,而是利用了Spring 4的条件化配置特性,以及Maven和Gradle提供的传递依赖解析,以此实现Spring应用程序上下文里的自动配置。
Spring4.0对条件化配置提供了支持,根据应用程序的Classpath、环境和其他因素,运行时决策将使用哪些配置,忽略哪些配置。
从本质上来说SpringBoot就是Spring,它做了那些没有它你自己也会做的Spring Bean配置。
使用IEDA构建第一个SpringBoot应用
File→newProject→SpringInitalizr
项目创建完成后,你会看到如下图的项目结构
整个项目遵循传统Maven或Gradle项目的布局,即主要应用程序代码位于src/main/java目录里,资源都在src/main/resource目录里,测试代码则在src/test/java目录里。
ReadingListAppliaction.java : 应用程序的启动类(bootstrap class),也是主要的Spring配置类。
Application.properties : 用于配置应用程序和SpringBoot的属性。
RedingListApplicationTests.java : 一个基本的集成测试类。
1.启动Spring
ReadingListApplication在SpringBoot应用程序里有两个作用:配置和启动引导。首先,这是主要的Spring配置类。虽然SpringBoot的自动配置免除了很多Spring配置,但你还需要少量配置来启用自动配置。
@SpringBootApplication开启了Spring的组件扫描和SpringBoot的自动配置功能。实际上,@SpringBootApplicationj将三个有用的注解组合在了一起。
)1.Spring的@Configuration:标明该类使用Spring的基于Java的配置。
)2.Spring的@ComponentScan:启用组件扫描,这样你写的Web控制器和其他组件才能被自动发现并注册为Spring应用上下文里的Bean。
)3.SpringBoot的@EnableAutoConfiguration:开启了SpringBoot的自动配置
要运行SpringBoot应用程序有几种方式,其中包含传统的war文件部署。但这里的main()方法可以让你在命令行里把该应用程序当作一个可执行的JAR文件来运行。这里想SpringApplication.run()传递了一个ReadingListApplication类的引用,还有命令行参数,通过这些东西启动应用程序。
应用程序跑起来之后,会启动一个监听8080端口的Tomcat服务器。可以通过localhost:8080,但由于还没有写控制器类,你只会收到一个HTTP 404错误页面。
2.测试SpringBoot应用
RedingListApplicationTest不止是个用于测试的占位符,他还是一个例子,告诉你如何为SpringBoot应用程序编写测试。
一个典型的Spring集成测试会用@ContextConfiguration注解标识如何加载Spring的应用程序上下文。但是,为了充分发挥SpringBoot的魔力,这里应该用@SpringApplication-Configuration注解。正如上图,ReadingListApplicationTests使用@SpringApplicationConfiguration注解从ReadingListApplication配置类里加载Spring应用程序上下文。
ReadingListApplicationTest里还有一个简单的测试方法,即contextLoads()。实际上它是就是个空方法。但这个空方法足以证明应用程序上下文的加载没有问题。如果ReadingListApplication里定义的配置是好的,就能通过测试,如果有问题,测试就会失败。
3.配置应用程序属性
Initializr为你生成的applicaiton.properties文件是一个空文件。实际上,这个文件完全是可选的,可以删除,对程序运行没有任何影响。
我们现在可以在里面配置一些东西
server.port= 8000
加上这一行,嵌入式Tomcat的监听端口就变成了8000。
这说明application.propeties文件可以很方便的帮你细粒度地调整SpringBoot的自动配置,还可以用它来指定应用程序代码所需的配置项。
要注意的是,完全不用告诉SpringBoot为你加载application.propeties,只要它存在就会被加载,Spring和应用程序代码都能获取其中的属性。
SpringBoot集成Mybatis
在pom文件中加入Mybatis相关依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
在application.properties中加入:
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/successful_said?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Hongkong
spring.datasource.data-username=root
spring.datasource.data-password=root
在启动类中加入:
@MapperScan("com.example.second.demosecond.dao")
在src/main/resource目录下创建mapper文件(也可使用注解开发),并在mapper文件中创建userMapper.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.second.demosecond.dao.UserDao" >
<resultMap id="BaseResultMap" type="com.example.second.demosecond.entity.User" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="userName" jdbcType="VARCHAR" />
<result column="address" property="address" jdbcType="VARCHAR" />
</resultMap>
<sql id="Base_Column_List" >
id, name, address
</sql>
<select id="selectUser" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from user
</select>
</mapper>
其中, mapper标签的namespace属性对应的是你的Dao,resultMap的type属性对应的是你的JavaBean。
在你的启动类的平级目录下创建Entity,Dao,Controller,Service四个文件夹,并编写相关代码,如下。
)1.在Entity文件夹中创建JavaBean,编辑代码如下:
public class User { private String UserName; private Integer id; private String address; public Integer getId() {
return id;
} public void setId(Integer id) {
this.id = id;
} public String getAddress() {
return address;
} public void setAddress(String address) {
this.address = address;
} public String getUserName() {
return UserName;
} public void setUserName(String userName) {
UserName = userName;
} }
)2.在Dao文件夹中创建Dao,代码如下:
import java.util.List; @Mapper
public interface UserDao { List<User> selectUser();
}
)3.在Controller文件中创建Controller,代码如下:
import com.example.second.demosecond.dao.UserDao;
import com.example.second.demosecond.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController
@EnableAutoConfiguration
@RequestMapping(value = "/boot")
public class BootController { @Autowired
private UserDao userDao;
@RequestMapping(value = "getUser")
public User getUser()
{
User user=new User();
user.setUserName("test");
return user;
} @RequestMapping(value = "getAllUser")
public List<User> getUsers()
{
List<User> userList= userDao.selectUser();
return userList;
}
}
SpringBoot对静态资源的映射规则
所有/webjars/**,都去classpath:/META-INF/resoures/webjars/找资源;
webjars:以jar包的方式引入静态资源;
webjar的网站:https://www.webjars.org/
maven中央仓库:https://mvnrepository.com/
页面都放在resource/templates下
SpringBoot整合Redis作为缓存
1.引入Redis的相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
2.在application.properties中配置Redis
application.properties中加入:
#Redis主机地址
spring.redis.host=
3.测试
我这里使用Spring内置的RedisTemplate(也可以使用jedis)
@Autowired
StringRedisTemplate stringRedisTemplate; //操作字符串 @Autowired
RedisTemplate redisTemplate; //key value
新增一个字符串类型的值
stringRedisTemplate.opsForValue().append("msg","hello");
读取
stringRedisTemplate.opsForValue().get("msg");
新增一个List类型的值
stringRedisTemplate.opsForList().leftPush("list","xiaoming");
stringRedisTemplate.opsForList().leftPush("list","xiaohong");
存入对象类型的数据
User user=userDao.findUserById(1);
redisTemplate.opsForValue().set("emp01",user);
存入后可使用RedisDesktopManager这款工具来查看。
你会发现,存入的数据为序列化后的(乱码),虽然不会影响正常的查询,下面个人提供两种解决方式:
默认如果保存对象,使用JDK序列化机制,序列化后的数据保存到Redis中。
将数据以JSON的方式保存
1)自己将对象转换成JSON
2)改变默认的序列化规则方式
1.创建一个类
@Configuration
public class MyRedisConfig{
@Bean
public RedisTemplate(Object,User)UserRedisTemplate(RedisConnectionFacation redisConntionFacation) throws UnknownHostException{
RedisTemplate<Object,User> template = new RedisTemplate();
templcate.setConnectionFactory(redisConnectionFacatiory);
Jackson2JsonRedisSerializer<User> userJackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<User>(User.class);
template.setDefaultSerializer(userJackson2JsonRedisSerializer);
return template;
}
}
2.使用@Autowired注解将方法自动装配到controoler里
@Autowired
RedisTemplate<Object, User> UserRedisTemplate;
3.测试使用
UserRedisTemplate.opsForValue().set("emp02",user);
SpringBoot任务
1.测试异步任务(在启动方法里还要 加上 @EnableAsync 注解 才可生效)
@Async
public void async(){
try {
Thread.sleep(3000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.print("处理数据中...");
}
2.测试定时任务(在启动类里要加上 @EnableScheduling注解才可生效)
@Scheduled(cron = "0,1,2,3,4 * * * * MON-SAT")
public void scheduled(){
System.out.print("定时发送...");
}
3.邮件任务
1)邮件发送需要引入 spring-boot-starter-mail
2)在appilcation.properties中配置邮箱
spring.mail.username=1242919235@qq.com
#pssword自己去邮箱里查看
spring.mail.password=
spring.mail.host=smtp.qq.com
#如果发送不出去(530)需使用以下配置
#spring.mail.properties.mail.smtp.ssl.enable=true
3)测试
@Autowired
JavaMailSenderImpl javaMailSender; @Test
public void email(){
SimpleMailMessage message =new SimpleMailMessage();
//邮件标题
message.setSubject("今晚开会");
//邮件内容
message.setText("今晚7:30开会");
//发给谁
message.setTo("xfy19990101@163.com");
//谁发的
message.setFrom("1242919235@qq.com");
javaMailSender.send(message);
}
SpringBoot简化开发 —— lombok
引入lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
lombok的一些注解
@NonNull : 注解在参数上, 如果该类参数为 null , 就会报出异常, throw new NullPointException(参数名) @Cleanup : 注释在引用变量前, 自动回收资源 默认调用 close() 方法 @Getter/@Setter : 注解在类上, 为类提供读写属性 @Getter(lazy=true) : @ToString : 注解在类上, 为类提供 toString() 方法 @EqualsAndHashCode : 注解在类上, 为类提供 equals() 和 hashCode() 方法 @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor : 注解在类上, 为类提供无参,有指定必须参数, 全参构造函数 @Data : 注解在类上, 为类提供读写属性, 此外还提供了 equals()、hashCode()、toString() 方法 @Value : @Builder : 注解在类上, 为类提供一个内部的 Builder @SneakThrows : @Synchronized : 注解在方法上, 为方法提供同步锁 @Log : @Log4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象 @Slf4j : 注解在类上, 为类提供一个属性名为 log 的 log4j 的日志对象 @AllArgsConstructor 生成一个无参构造 @NoArgdConstuctor 生成一个无参构造
我们使用@Data注解就可以有以下注解的功能:
@ToString
@Getter
@Setter
@EqualsAnHashCode
@NoArgsConstructor
需要注意的是,同时使用@Data和@AllArgsConstructor后,默认的无藏构造函数失效,如果需要它,要需要设置@noArgsConstructor
SpringBoot虚拟路径,物理路径的配置及跨平台时的解决方案
1.application.properites 中配置
2.添加WebMvcConfig工具类
3.创建文件夹
这样在不确定项目部署在什么平台下时,有两种选择方案,平台改变,只需修改配置文件即可。
SpringBoot工程生产环境的发布
1.打成Jar
使用nohup java -jar text.jar > log.txt &命令启动工程
log.txt : 用来存储日志,自动创建。
& : 后台运行。
java -jar : 系统环境变量配置的jre。
nohup : 不挂断地运行命令,一般结合&使用。
2.打成war(不推荐)
1)修改pom文件
<packaging>war</packaging>
2)将SpringBoot默认的tomcat设置为provided
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
3)Application启动类继承SpringBootServletInitializer
4)claen package
5)copy生成的war到tomcat的wabapps下,运行tomcat
注:tomcat的版本必须是8及以上
SpringBoot从零到上线的更多相关文章
- 视频作品《springboot基础篇》上线了
1.场景描述 第一个视频作品出炉了,<springboot基础篇>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. 课程内容 课程地址:https://ed ...
- 模拟Springboot一:(零xml配置搭建SSM项目)
在spring官网文档中无论是spring的基础文档,还是spring-mvc文档都推荐我们使用javaconfig的方式来搭建项目 间接说明 (优点:javaconfig配置>xml配置) 其 ...
- 第一个独立开发的游戏 怪斯特:零 已经上线APP STORE!
今天是个值得纪念的日子,而且是双喜临门 2年多来的摸爬滚打,终于有了回报 第一喜:自己独立开发的游戏 怪斯特:零 已经通过审核并上架APP STORE! 第二喜:迈入了自己期待2年之久的游戏行业,年后 ...
- 基于SpringBoot从零构建博客网站 - 技术选型和整合开发环境
技术选型和整合开发环境 1.技术选型 博客网站是基于SpringBoot整合其它模块而开发的,那么每个模块选择的技术如下: SpringBoot版本选择目前较新的2.1.1.RELEASE版本 持久化 ...
- SpringBoot从零单排 ------ 拦截器的使用
在项目开发中我们常常需要对请求进行验证,如登录校验.权限验证.防止重复提交等等,通过拦截器来过滤请求.自定义一个拦截器需要实现HandlerInterceptor接口.代码如下: import org ...
- SpringBoot从零单排 ------初级入门篇
有人说SSM已死,未来是SpringBoot和SpringCloud的天下,这个观点可能有点极端,但不可否认的是已经越来越多的公司开始使用SpringBoot.所以我将平时学习SpringBoot的内 ...
- SpringBoot | 第零章:前言
缘起 前段时间公司领导叫编写一两课关于springboot的基础知识培训课程,说实话,也是今年年初才开始接触了SpringBoot这个脚手架,使用了之后才发现打开了一个新世界.再之后也没有一些系统的学 ...
- 基于SpringBoot从零构建博客网站 - 整合lombok和mybatis-plus提高开发效率
在上一章节中<技术选型和整合开发环境>,确定了开发的技术,但是如果直接这样用的话,可能开发效率会不高,为了提高开发的效率,这里再整合lombok和mybatis-plus两个组件. 1.l ...
- 基于SpringBoot从零构建博客网站 - 确定需求和表结构
要确定一个系统的需求,首先需要明确该系统的用户有哪些,然后针对每一类用户,确定其需求.对于博客网站来说,用户有3大类,分别是: 作者,也即是注册用户 游客,也即非注册用户 管理员,网站维护人员 那么从 ...
随机推荐
- SpringCloud-分布式链路跟踪配置详解
SpringCloud-分布式链路跟踪 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 注:作者使用IDEA + Gradle 注:需要有一定的java SpringBoot and ...
- 设计模式 | 外观模式/门面模式(facade)
定义: 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 结构:(书中图,侵删) 一个简洁易用的外观类 一个复杂的子系统 实例: 书中提到了理 ...
- iOS----------学习路线思维导图
UI相关 Runtime OC特性 内存管理 Block 多线程 Runloop 网络相关 设计模式 架构 算法 第三方库
- android:layout_weight属性详解
weight:重量.权重. 当我们给一个view设置了android:layout_weight属性,意味着赋予它话语权,常规思维就是谁的weight大,谁说了算(空间占比大). 下面我们来看下具体的 ...
- 虹软人脸识别ArcFace2.0 Android SDK使用教程
一.获取SDK 1.进入ArcFace2.0的申请地址 https://ai.arcsoft.com.cn/product/arcface.html 2.填写信息申请并提交 申请通过后即可下载SDK, ...
- SQL server 表信息查询
一.查看所有表的行数select a.name as '表名',b.rows as '表数据行数'from sysobjects a inner join sysindexes bon a.id = ...
- 统一修改表单参数(表单提交的空字符串统一转null)
统一修改表单参数(表单提交的空字符串统一转null) 1.介绍: 我们业务中有时会遇到提交的表单中某个参数为空字符串,导致后台接受的为空字符串("")而不是我们理想中的null,会 ...
- Pytorch系列教程-使用字符级RNN生成姓名
前言 本系列教程为pytorch官网文档翻译.本文对应官网地址:https://pytorch.org/tutorials/intermediate/char_rnn_generation_tutor ...
- [Inside HotSpot] Visual Studio2017编译调试openjdk12
编译 下载并编译好freetype,然后安装cygwin并安装必要工具: autoconf make zip unzip 当前目录效果为: 然后cygwin打开,进入openjdk12目录输入命令进行 ...
- 学python走过的坑 三 不能实现的浏览器缩放功能
公司一个项目,在启动web页面时,默认应该是打开项目页面,然后浏览器启动时总是打开一个广告页面,经理让写一个脚本,让电脑每次开机自启浏览器,且加载项目页面.浏览器自启和打开项目页面轻松搞定,这时问题来 ...