入行java也有大半年了,最近有时间,开始慢慢自己学习springboot,也算为将来打下基础

这里是记录springboot用到的基础技术点,可能不全,欢迎指正!

1.首先肯定是直接先创建一个最简单的springboot项目,我是用的idea开发的,其他ide应该也差不多

springboot2.0以上必须要用jdk1.8以上,不然会出很多奇怪的错误!

Next,这里Group和Artifact跟普通maven项目一样填写就行了。主要是Packaging选项,如果选择了jar,将使用springboot内置tomcat,如果选择了war其实变化不大,会多出一个文件和tomcat的maven依赖

区别:

jar包:直接通过内置tomcat运行,不需要额外安装tomcat。如需修改内置tomcat的配置,只需要在spring boot的配置文件中配置。内置tomcat没有自己的日志输出,全靠jar包应用输出日志。但是比较方便,快速,比较简单。

war包:传统的应用交付方式,需要安装tomcat,然后放到waeapps目录下运行war包,可以灵活选择tomcat版本,可以直接修改tomcat的配置,有自己的tomcat日志输出,可以灵活配置安全策略。相对打成jar包来说没那么快速方便。

接着选择web组件,这个基本必须选!然后其他的组件你可以根据需求选择,还可以选择Mysql和Mybatis(注意:如果选择了这两个,生成的springboot项目你没有配置好数据源的话,启动是会报错的,也可以选择他们生成项目后,去pom.xml文件暂时注释掉Mysql和Mybatis两个依赖)

再Next,Finish,就创建成功啦!

直接运行下面的方法,就可以启动项目了(虽然项目什么都没有,连个index页面都没有)

看到这个,并且没有报错,就是启动成功了

当然,这只是最简单的第一步,后面慢慢一点一点学习

2.刚生成的springboot项目的resources目录下有static和templates文件夹

(1)static:默认是放静态资源的

我们将图片1.jpg放到static文件夹里面,启动项目,在浏览器输入localhost:8080/1.jpg  (不用加项目名),可以访问到图片

(2)templates:放视图模板,就是springBoot的动态页面,springboot已经不推荐使用jsp了,springboot可以集成freemarker或者thymeleaf,他们都可以完全替代jsp,这里两个都介绍。

1) 集成freemarker ,很多公司都使用freemarker模板引擎,具体的好处请自行百度

在pom.xml加入依赖freemarker

<!--freearker依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

在 templates 文件夹新建文件 ftlIndex.ftl

这是一个freemarker的模板文件,要是freemarker的基础语法不懂的同学建议去看下

第一个ftl项目
姓名:${name}
年龄:${age}
性别:
<#if sex="1">男生<#elseif sex="2">女生<#else>其他
</#if>

然后新建一个controller,因为整合了freemarker,这里返回值直接访问templates目录下的ftlIndex.ftl,springboot的配置文件默认已经帮我们配置好了前后缀,当然我们也可以去application.properties修改,不建议修改。

可以在方法传入map参数,会传到前端显示,还可以像传统的做法一样,传入一个model或者modelAndView,效果一样

package com.liqiye.springbootdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.Map;/*** @author liqiye* @description   返回freemarker  .ftl文件* @date 2019/4/5*/
@Controller
public class FtlController {/*** 访问在templates目录里面的ftl文件,这里自动在返回值后面加上.ftl后缀* @param map  可以在方法的参数上面加上map,替换模板文件里面的值。注意:必须加在方法的参数* @return*/@RequestMapping("/ftlIndex")public String tets(Map<String,Object> map){map.put("name","李启业");map.put("age","23");map.put("sex","0");return "ftlIndex";}}

效果图:

2)集成thymeleaf,这是springboot官方推荐我们使用的模板引擎

引入maven

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

然后在application.properties配置文件里加上 thymeleaf的配置参数

#thymeleaf 模板解析器属性
spring.thymeleaf.mode=HTML5
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.servlet.content-type=text/html
# 默认的前后缀,不写默认就是这个
spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.suffix=.html
#开发时关闭缓存,不然没法看到实时页面
spring.thymeleaf.cache=false

在 templates 文件夹新建文件 thymeleafView.html

(其实thymeleaf就是一个html页面嵌入特定的语法标签,然后作用跟jsp基本一样,这里测试了下常用简单的thymeleaf语法,详细语法建议百度下)

<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<html  xmlns:th="http://www.thymeleaf.org" >
<head><meta charset="UTF-8"><title>测试thymeleaf</title>
</head>
<body>
<div th:object="${user}"><p>姓名:<span th:text="*{name}">xx</span></p>   <!--可以用*{}来省略前文引用的对象--><p>年龄:<span th:text="${user.age}">xx</span></p><p>性别:<span th:text="${user.sex}">xx</span></p>
</div>
<table border="1"><tr><th>姓名</th><th>年龄</th></tr><tr th:each="us:${list}"><td th:text="${us.name}"></td><td th:text="${us.age}"></td></tr>
</table>
<div><p th:if="${testif}">th:if标签测试:  true显示</p><p th:unless="${testif}">th:unless标签测试:  false显示</p>
</div>
<div th:switch="${testswitch}"><div th:case="'1'"><p>执行th:switch标签的值为 1 的case的代码块</p></div><div th:case="'2'"><p>执行th:switch标签的值为 2 的case的代码块</p></div><div th:case="'3'"><p>执行th:switch标签的值为 3 的case的代码块</p></div>
</div>
<div><a href="http://www.baidu.com" th:href="@{testthhref}">超连接</a> <!--注意如果在@{/}里加了/ ,它是相对路径,前面会加上当前访问路径-->
</div>
</body>
</html>

转存失败重新上传取消

controller

package com.liqiye.springbootdemo.controller;import com.liqiye.springbootdemo.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;import java.util.ArrayList;/*** @author liqiye* @description 测试thymeleaf模板的controller* @date 2019/5/6*/
@Controller
public class ThymeleafController {@GetMapping("/thymeleaf")public ModelAndView thymeleaf(){ModelAndView modelAndView = new ModelAndView();User user = new User();user.setName("李启业");user.setAge(23);user.setSex("男");User user1 = new User("小红", 1);User user2 = new User("小黄", 2);User user3 = new User("小绿", 3);ArrayList<User> list = new ArrayList<>();list.add(user1);list.add(user2);list.add(user3);modelAndView.addObject("user",user);modelAndView.addObject("list",list);modelAndView.addObject("testif",true);modelAndView.addObject("testswitch","2");modelAndView.setViewName("thymeleafView");return modelAndView;}@ResponseBody@GetMapping("/testthhref")public String test_thhref(){return "测试 th:href";}}

测试 浏览器输入: http://localhost:8080/thymeleaf  页面可以像jsp一样动态填充数据

3.开启springboot的热部署

(1)用devtools的热部署

引入maven

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

转存失败重新上传取消

引入maven依赖后其实热部署就已经可以了,默认是开启的,不过如果你想指定热部署哪些目录,又有某些目录不想热部署,可以在application.properties配置文件里加上以下配置(当然,不加以下配置全部文件都会热部署)

#热部署生效
spring.devtools.restart.enabled: true
#设置重启的目录
spring.devtools.restart.additional-paths: src/main/java
#classpath目录下的WEB-INF文件夹内容修改不重启
#spring.devtools.restart.exclude: WEB-INF/**

转存失败重新上传取消

注意:还有一点,我用的idea开发,要想springboot的热部署起作用,要先开启idea的自动热加载

1)setting -> Compile -> Build project automatically --> 选中

2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running

转存失败重新上传取消

转存失败重新上传取消

接下来,自己去在controller里修改代码,然后Ctrl+S下,发现在控制台又打印了springboot的标志和一大串东西,证明热部署成功。(其实我觉得这个devtools热部署超级辣鸡,但是学习下也没损失)

(2)用jrebel热部署(强烈建议)

这个插件是收费的,破解教程这里就不放了,自己百度吧,很简单的

装好jrebel插件,创建好springboot项目后,在idea界面的左下方,点击下图位置,选中你项目勾上

转存失败重新上传取消

这时候还没行喔,在idea界面右上方,配置开启热部署,点击Edit Configurations...

转存失败重新上传取消

下图红色框都要选中Update classes and resources

转存失败重新上传取消

当然不要忘了,jrebel也要先开启idea的自动热加载:

1)setting -> Compile -> Build project automatically --> 选中

2)按组合键 Shift+Ctrl+Alt+/,选择Registry,进去勾选上compiler.automake.allow.when.app.running

转存失败重新上传取消

转存失败重新上传取消

还有最后一步,启动springboot项目不要再去那个启动app那里运行那个方法了,用原来的启动类启动是不会启用jrebel插件热部署的,在下图位置,先选中启动类,然后点击那个虫子按钮,debug启动就可以了!

转存失败重新上传取消

还有上面两种热部署最好不要同时用,只用一种就好了。

4.springboot项目启动的vm参数设置(设置合理可以提高性能)

因为我用的idea开发,我就直接在idea那里设置了,十分方便

转存失败重新上传取消

转存失败重新上传取消

参数,我这里是设置初始化1G,最大1G,可以根据实际情况自行修改

-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC

转存失败重新上传取消

怎么查看设置的vm内存是否成功?

去到本地安装jdk的bin目录,里面有个文件jconsole.exe,它可以查看本地运行的虚拟机占用内存等情况

转存失败重新上传取消

先启动你的springboot项目(用修改了参数的方式启动),然后双击这个图标!选择你刚启动的项目,直接点连接,不用账号密码,点击不安全的链接

转存失败重新上传取消

这时候就可以看到(第一个),最大内存,与初始化内存就是1个G,设置成功!

转存失败重新上传取消

5.springboot整合jsp

springboot官方不推荐使用jsp进行前端开发,所以默认不集成的,但是之前做项目都是用的jsp,这里肯定要集成下

注意:要集成jsp,springboot项目只能是war包形式

(1)引入maven

<dependency><groupId>org.apache.tomcat.embed</groupId><artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId>
</dependency>

转存失败重新上传取消

(2)创建目录 webapp、WEB-INF(这个应该不用说了吧)

(3)在webapp-WEB-INF 下 来个最简单的jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/><title>Title</title>
</head>
<body>
springboot整合jsp
</body>
</html>

转存失败重新上传取消

(4)controller

package com.liqiye.springbootdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;/*** @author liqiye* @description jsp整合controller,项目必须是war包* @date 2019/4/5*/
@Controller
public class JspController {@RequestMapping("/jsp")public String jspIndex(){return "index";}}

转存失败重新上传取消

(5)配置前后缀(类似springmvc)

在application.properties配置文件里面加上

spring.mvc.view.prefix=/WEB-INF/
spring.mvc.view.suffix=.jsp

转存失败重新上传取消

(6)测试

注意:访问路径不需要加上项目名

转存失败重新上传取消

转存失败重新上传取消

注意:如果你在整合jsp的同时,也整合了其他模板引擎(freemarker或者thymeleaf),即在pom.xml文件引入了整合的模板引擎包,并且在springboot配置文件指定了该引擎读取的前后缀,这时,jsp整合是不生效的!会被覆盖,读取的是你指定的模板引擎的位置,此时freemarker和thymeleaf都可以正常使用,但是jsp不生效。所以jsp跟模板引擎不要一起整合。

6.集成lombok(ide安装lombok我就不放了)

相信lombok的好处不用我再说了,特别是用springboot开发,当然是要将快速开发进行到底!

(1)引入maven

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

转存失败重新上传取消

(2)log4j的配置文件  log4j.properties

直接放到resources目录下

# LOG4J配置
log4j.rootCategory=INFO, stdout, file# 控制台输出
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n# root日志输出到文件
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.file=/data/logs/springboot-log4j-all.log
log4j.appender.file.DatePattern='.'yyyy-MM-dd
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n# 按不同package进行输出
# com.micai包下的日志配置
log4j.category.com.micai=DEBUG, didifile# com.micai下的日志输出
log4j.appender.didifile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.didifile.file=/data/logs/springboot-log4j-my.log
log4j.appender.didifile.DatePattern='.'yyyy-MM-dd
log4j.appender.didifile.layout=org.apache.log4j.PatternLayout
log4j.appender.didifile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L ---- %m%n# ERROR级别输出到特定的日志文件中
log4j.logger.error=errorfile
# error日志输出
log4j.appender.errorfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.errorfile.file=/data/logs/springboot-log4j-error.log
log4j.appender.errorfile.DatePattern='.'yyyy-MM-dd
log4j.appender.errorfile.Threshold = ERROR
log4j.appender.errorfile.layout=org.apache.log4j.PatternLayout
log4j.appender.errorfile.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS} %5p %c{1}:%L - %m%n

转存失败重新上传取消

(3)测试。

新建一个实体类user

这里简单使用了下 @Data 和 @Slf4j ,运行了下main方法,控制台打印出user的信息,成功。

(注意:lombok提供的@Slf4j注解,只能调用log对象打印日志,名字固定在源码了,当然你也可以修改源码)

package com.liqiye.springbootdemo.entity;import com.liqiye.springbootdemo.utils.SetName;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;/*** @author liqiye* @description* @date 2019/4/6*/
@Data
@Slf4j
public class User {public Integer id;public String name;public Integer age;public static void main(String[] args) {User user = new User();user.setName("张三");user.setAge(23);log.info(user.toString());}}

转存失败重新上传取消

(4)当然如果你不想安装lombok,这里也提供整合log4j的方法

直接引入maven

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

转存失败重新上传取消

上面的 log4j.properties 配置文件不要忘了!

private final Logger log = LoggerFactory.getLogger(this.getClass());

转存失败重新上传取消

7.集成 PageHelper 分页插件

引入maven

<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.2.5</version>
</dependency>

转存失败重新上传取消

下面集成mybatis一起测试

8.集成mybatis

(1)引入mybatis和mysql的连接驱动

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.0.0</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

转存失败重新上传取消

(2)在application.properties 配置文件里面加上数据源

#datasource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123

转存失败重新上传取消

(3)创建数据库springboot(名字跟上面对上就行)

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

转存失败重新上传取消

(4)创建实体类 User

package com.liqiye.springbootdemo.entity;import lombok.Data;/*** @author liqiye* @description* @date 2019/4/6*/
@Data
public class User {public Integer id;public String name;public Integer age;}

转存失败重新上传取消

(5)创建 Usermapper 接口 ,这里直接用注解注入sql语句,不加xml那个文件了

注意:你可以在每一个mapper接口上面加上@Mapper注解(作用是被springboot扫描解析成mapper),也可以在springboot的启动类上面加上注解 @MapperScan(basePackages = {"com.liqiye.springbootdemo.mapper"}),实现,指定包扫描,用其中一种即可。

package com.liqiye.springbootdemo.mapper;import com.liqiye.springbootdemo.entity.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;import java.util.List;// @Mapper
public interface UserMapper {@Select("select * from user")List<User> findList();@Select("select * from user where name = #{name}")User findByName(@Param("name")String name);@Insert("insert into user(name,age) values(#{name},#{age})")int insert(@Param("name")String name,@Param("age")Integer age);}

转存失败重新上传取消

转存失败重新上传取消

(6)创建UserService

package com.liqiye.springbootdemo.service;import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;/*** @author liqiye* @description* @date 2019/4/6*/
@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public int insert(String name,Integer age){int i = userMapper.insert(name, age);return i;}// 分页查询public PageInfo<User> findList(int page, int pageSize){PageHelper.startPage(page,pageSize);List<User> list = userMapper.findList();PageInfo<User> pageInfo = new PageInfo<User>(list);return pageInfo;}}

转存失败重新上传取消

(7)创建 Usercontroller

package com.liqiye.springbootdemo.controller;import com.github.pagehelper.PageInfo;
import com.liqiye.springbootdemo.entity.User;
import com.liqiye.springbootdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author liqiye* @description 测试整合springboot和mybatis* @date 2019/4/6*/
@RestController
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/insertuser")public String insertuser(String name,Integer age){int i = userService.insert(name, age);return "操作:"+i;}@RequestMapping("/findList")public PageInfo<User> findList(int page, int pageSize){return userService.findList(page,pageSize);}}

转存失败重新上传取消

(8)测试

转存失败重新上传取消

转存失败重新上传取消

返回1,并且到数据库查看新增了一条数据,插入成功!

---------------------------------------------------------------------------------------------

给数据库多插几条数据,然后测试分页

转存失败重新上传取消

转存失败重新上传取消

页面成功显示分页的json数据!

(9)上面是实现了启动类扫包的方式注入,那是sql语句用注解的方式写在mapper上面,若我们用传统的方式mapper和接口分开写,然后在resources目录下建mapper目录,里面放封装sql语句的xml文件,这样的方式是没办法读取封装sql的xml文件的,这时,我们只需要在application.properties文件加上下面的代码,就可以访问到了

路径是你存放封装sql语句的xml文件,这样两种方式的mapper就都能用了(注解方式和xml方式)

#加载Mybatis封装sql语句的xml文件
mybatis.mapper-locations = classpath:mapper/*Mapper.xml

转存失败重新上传取消

或者说如果你的接口,和封装sql语句的xml文件在同一目录下,就不用加上面的配置文件,因为springboot默认读接口时就是同一个目录读取xml文件,但是如果你用的idea开发,idea默认不会编译java目录下的xml文件,需要手动开启,则需要在pom.xml文件加上

<build><!-- idea默认在java目录下不编译xml文件,这里开启编译java目录下的xml文件 --><resources><resource><directory>src/main/java</directory><includes><include>**/*.xml</include></includes></resource></resources>
</build>

(10)在控制台开启打印sql语句

默认执行完sql语句后,不会在控制台打印出sql语句,这样很不方便我们开发,在application.properties配置文件加上

#开启打印执行的sql语句,logging.level.后面跟接口所在的包名
logging.level.com.liqiye.springbootdemo.mapper=debug

9.开启事务(就是在对数据库操作时,如果出现异常,对数据库的新增改都将回滚)

引入spring的事务支持

<!-- 本地事务 -->
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.8.RELEASE</version>
</dependency>

使用十分简单,只需要在要使用事务的方法,或者类上面,加上 @Transactional 注解 即可!

直接在上面的 UserController 的新增方法上面修改,使它内部报错:

    // 事务起遇到异常 前面的增删改都将回滚的作用,不加@Transactional注解,即使报错,对数据库的操作也不会回滚,会造成数据异常@RequestMapping("/insertuser")@Transactional    // 开启事务,采用的是AOP的环绕通知,可以作用在类、接口、public方法上public String insertuser(String name,Integer age){int i = userService.insert(name, age);int j = 1/0;return "操作:"+i;}

转存失败重新上传取消

访问url地址

转存失败重新上传取消

然后报错,去到数据库查看,发现数据并没有插入成功,事务起作用了!

10.开启异步 (所谓异步,就是A方法调用B方法,然后A和B方法会同时运行,A方法不会因为B方法还没返回而阻塞)

首先在springboot 的启动类上面加上 @EnableAsync 注解 开启异步

转存失败重新上传取消

然后在要开启异步的方法上面加上 @Async 注解

package com.liqiye.springbootdemo.service;import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;/*** @author liqiye* @description  测试Async异步* @date 2019/4/6*/
@Service
@Slf4j
public class TestAsyncService {@Asyncpublic String menthod(){log.info("2");try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}log.info("3");return "返回";}}

转存失败重新上传取消

调用上面的service 的controller代码:

    // 测试异步@ResponseBody@RequestMapping("/test2")public String test2(){log.info("1");String s = testAsyncService.menthod();log.info("4");return "result:"+s;}

转存失败重新上传取消

测试:

在浏览器输入url : http://localhost:8080/test2

控制台打印:

转存失败重新上传取消

浏览器显示:

转存失败重新上传取消

因为开启了异步,controller的方法和service的方法同时运行,controller的方法不会因为service的方法在休眠而暂停,所以日志打印顺序为1、4、2、3 ;而controller的方法运行到结束时,service的方法还没返回,没有返回值,所以显示null。

11.Banner

springboot项目启动的时候是不是总能看到下面这个图标

1)这个可以去掉不显示的,在application.properies 配置文件里加上 spring.main.banner-mode=off 即可

#关掉springboot启动图标
spring.main.banner-mode=off

2)也可以替换掉这个图标(不要同时去掉 与 替换 ,这样就是没有显示)

在resources目录下新建文件 banner.txt (springboot启动默认就是读取这个文件名,不能随意命名,不然没法读取)

                   _ooOoo_o8888888o88" . "88(| -_- |)O\  =  /O____/`---'\____.'  \\|     |//  `./  \\|||  :  |||//  \/  _||||| -:- |||||-  \|   | \\\  -  /// |   || \_|  ''\---/''  |   |\  .-\__  `-`  ___/-. /___`. .'  /--.--\  `. . __."" '<  `.___\_<|>_/___.'  >'"".| | :  `- \`.;`\ _ /`;.`/ - ` : | |\  \ `-.   \_ __\ /__ _/   .-` /  /
======`-.____`-.___\_____/___.-`____.-'======`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^佛祖保佑       永无BUG

该txt文件,除了名字和目录不能改外,里面的内容逆向怎么改都行,这里放几个根据文字生成图标的网站

http://patorjk.com/software/taag

http://www.network-science.de/ascii/

https://www.degraeve.com/img2txt.php

12.springboot默认的错误页面显示

如果你请求了一个不存在的url,或者服务器里代码运行时发生了异常,默认是出现下面两个不友好的页面404和5xx

我们项目一般肯定会有一个全局的异常捕获的显示页面,给用户友好的显示出错

而springboot里我们可以十分简单的实现不同错误,显示不同的页面,不需要写什么拦截器什么的

1)在resources目录下新建一个public 目录,在public 目录里新建一个error目录(目录名字不能错

2)在resources/public/error 里新建文件 404.html  ,文件名不能随便(当然你们应该做一个很帅的页面放进去)

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>出错</title>
</head>
<body>
404错误
</body>
</html>

这样如果发生了404错误,显示的就是这个html页面

还可以新建 5xx.html 这样的名字,他会自动匹配发生 5xx 的所有错误,然后都是显示这个html页面

3)测试:我们发起一个不存在的请求  http://localhost:8080/bucunzaideurl

显示如下:

4)还可以使用freemarker的模板页面显示,不过文件放置的位置不一样,应该在resources目录下的templates目录下的error目录里,新建类似404.ftl、 5xx.ftl 的模板文件

13. springboot整合redis 加上 封装StringRedisTemplate 的redis工具类的运用

14. Springboot 整合 hibernate 和 jpa

15. springboot2.0 整合 activiti 6.0

16. springboot 整合 RabbitMQ

当然,这只是记录我学习springboot的过程,很多技术点我都写的十分简单,十分片面,不过对于springboot的入门是十分有帮助的!有空继续完善

从零开始学习springboot,记录点相关推荐

  1. 从零开始学习springboot之springboot搭建

    博主刚开始实习不久,还是小白一枚,被公司的各种新奇技术搞得眼花缭乱了好久,主要是用springboot和dubbo构建起来的项目.看完之后才知道springboot真的是java开发者的福音啊 话不多 ...

  2. 从零开始学习springBoot(Contextpath+修改默认idk)

    1.配置Contextpath 修改application.properties文件:添加server.context-path=/spring-boot     之后需要访问http://127.0 ...

  3. Elasticseach 从零开始学习记录(四) - 整合springboot2.x

    1. 我的springboot版本为2.2.6.RELEASE, 本文推荐elasticsearch-rest-high-level-client在           springboot里集成el ...

  4. Elasticseach 从零开始学习记录(三) - 分布式部署

    1. 先关闭elasticseach,登录root账户,修改之前解压的es文件夹名为master,好区分,并重新给改名后的文件夹赋esuser权限. mv elasticsearch-7.14.1 e ...

  5. Elasticseach 从零开始学习记录(二) - Head插件

    安装Head插件的原因: 可以提供友好的web界面,还可以实现基本信息的查看,rest请求的模拟,以及数据的基本检索. 1. 检查服务器是否已经安装node.js 如未安装,自行百度安装node 2. ...

  6. Elasticseach 从零开始学习记录(一) - 单实例环境搭建

    声明: 本文章是本人第一次学习ES,把过程和过程中遇到问题,以及百度后解决方案记录下来,如有问题,希望高手指出,谢谢. 环境:服务器为linux centos7 64位, jdk8 , ES7.14. ...

  7. 学习SpringBoot笔记以及错误记录

    学习SpringBoot笔记以及错误记录 <1>. 启动类(SpringBootApplication)放错位置 错误场景:MainApplication类不应放在默认的src.main. ...

  8. 学习 spring-boot (一)

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置. s ...

  9. access 导入 txt sql语句_从零开始学习 MySQL 系列索引、视图、导入和导出

    阅读本文大概需要 8 分钟 前言上篇文章我们学习了数据库和数据表操作语句,今天我们学习下数据库索引,视图,导入和导出的知识.作为基础篇,不会涉及到关于索引和视图的高级应用和核心概念,但是基本操作大家会 ...

最新文章

  1. 中科院计算所沈华伟:GNN发展简史,诟病才是成长动力
  2. C#访问远程主机资源的方法
  3. Windows 11 大更新!可安装超千款 Android 应用
  4. 薛定谔的猫——.NET 4.1 中的新基类,开源Preview中
  5. weblogic搭建
  6. 让一个文字在背景图片水平居中的方法
  7. leetcode 剑指 Offer 05. 替换空格
  8. python如何复制oracle数据_Python使用cx_Oracle模块将oracle中数据导出到csv文件的方法...
  9. Weave Scope 容器地图 - 每天5分钟玩转 Docker 容器技术(80)
  10. HyperLedger/Fabric JAVA-SDK with 1.1
  11. 深度学习模型参数初始化的方法
  12. 总有被遗忘或者没有及时跟进的工作
  13. 窘境与出路:AI时代的女性科技光芒
  14. 怎样选择(FC-SAN)光纤通道(存储)交换机
  15. 将Clound compare以及一些mathLab 等源码,集成到我们vs上来并编译
  16. COBOL中的基本语法(转)
  17. 汉字转全拼,简拼组件
  18. 剖析Solidity合约创建EVM bytecode
  19. ipv6地址概述——了解ipv6与ipv4不同
  20. 五分之一金融机构将从2018年开始探索加密货币交易

热门文章

  1. NEC即将推出新品手机N800
  2. 计算平均数(C语言)
  3. java获取 msinfo32 api_dos命令systeminfo图文教程,显示操作系统配置信息msinfo32
  4. Symbian S60开发环境搭建
  5. 5( 预热)Pandas库的安装
  6. Mysql注入bypass攻略
  7. SwiftUI,Swift 教程推荐(免费为主)
  8. Idea导出war包
  9. Java中List集合去重的几种方式
  10. koala java,GitHub - lijiankun24/Koala: 从 Java 字节码到 ASM 实践