这次我们来说一下我们的SpringBoot,现在SpringBoot已经成为趋势,在我这里我用三篇文章的形式来讲清楚我们的SpringBoot,大致分为,第一篇讲搭建,基本使用,第二篇三方集成,自动装配原理,第三篇,将main方法启动原理,总结史上最全的SpringBoot注解及其含义。后面有机会再细致的扒一下源码(书还没看完,怕误导大家)。

  我们先来看我们的搭建,很简单,我们来一个最小最简洁的启动方式。

三种搭建(一):

  准备工作,我们是在IntelliJ IDEA的工具上来讲解的,用Eclipse或者STS的都可以,大同小异,我们讲三种搭建方式,以后就别某度SpringBoot的搭建了。

  1.我们先来创建一个maven项目,最简单的方式创建即可

输入我们的GroupID和ArtifactID

点击我们的Finish,我们的第一步就完成了。

自己对比一下创建完成的目录结构是不是一致的。

  2.接下来我们导入我们的jar依赖,修改我们的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.springboot_xiaocai</groupId>
<artifactId>springboot_xiaocai</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- 加入springboot依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</dependency> <!-- 加入spring mvc-web依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies> <build>
<plugins>
<!-- 引入一个springboot插件,可以支持我们将web应用打成jar包-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

所有加粗字体为我后来加的,你也可以全部复制到你的pom.xml文件下(注意项目名)。

  3.加入我们的配置文件yml,在resources目录下创建application.yml,不创建也可以

application.yml

server:
port: 8888

  4.写入我们的启动类,MainStart.java

MainStart.java

package com.springboot_xiaocai.controller;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class MainStart { public static void main(String[] args) {
SpringApplication.run(MainStart.class,args);
} }

  5.随便编写一个Controller测试类,运行main方法,走起。(贴图带目录结构,自己对比一下自己的对不对)

我们的第一种简单搭建就完成了。配置比较麻烦,不建议这样搭建,我们来看第二种搭建方式

三种搭建(二):

  1.我们还是来构建一个项目,这里选择Spring Initializr

  2.输入参数,点击next

  3.选择Web,勾选Spring Web,点击next(有的版本可能没有Spring Web,那你就勾选Spring Web Starter),最上方可以设置spring boot的版本,我这里是2.1.9。

  4.随便编写一个测试类,启动,看效果。

三种搭建(三):

  第三种几乎没人用的,不是很方便,我只是带着说一下,直接登录https://start.spring.io/ 然后设置相关参数,点击Generate就会生成我们想要的SpringBoot项目了。

上述三种方式,第二种是最好用,也是最常用的,我们只需要记住第二种就可以了。

 配置文件:

  有的小伙伴看到我的前两种搭建方式配置文件并不一样,一种是application.yml,另外一种是application.properties,这两种配置文件都是可以的,官方推荐我们使用application.yml文件,我可以不接受他的意见,按照个人喜好来咯。

  我们很多时候我们的生产环境和我们的开发环境的配置是完全不一致的,我们可以这样来设置

application.yml

spring:
profiles:
active: pro
---
spring:
profiles: dev
server:
port: 1111
---
spring:
profiles: pro
server:
port: 2222

意思就是我们激活pro的配置,下面用三个减号来设置多文档块。

  貌似这样的设置还不是特别好,我们再来改一下。将application.yml复制多份,分别叫application-dev.yml和application-pro.yml

application-pro.yml

server:
port: 2222

这样我们就更好的区分了,我们的配置环境,但貌似还不是很好的,我们的主配置是激活我们的pro配置,不能每次我们开发都设置激活我们的开发环境,然后部署的时候再改为激活生产环境吧。我们再来改一下。

  我们保持application.yml配置不动,还是激活我们的Pro配置文件,我们来设置一下我们的启动参数

选择我们的主启动类,将我们的启动参数-Dspring.profiles.active=dev配置进去,如果要激活多个可以用|连接,例如-Dspring.profiles.active=dev|pro|st

这样配置,我们再启动的时候就管你application.yml配置的激活什么配置,也是不起作用的,只有在我们的编辑器内部配置的参数才是生效的。

JAR与WAR

  我们都知道SpringBoot打包出来的都是jar包,我们有时候不得不弄成war包的,比如遇到使用jsp的情况。

首先我们改一下我们的pom文件,设置成<packaging>war</packaging>

再来一下spring-boot-starter设置为provided

最后一步,改我们的启动类,继承SpringBootServletInitializer类,重写configure方法。

package com.springboot_xiaocaijishu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication
public class SpringbootXiaocaijishuApplication extends SpringBootServletInitializer { public static void main(String[] args) {
SpringApplication.run(SpringbootXiaocaijishuApplication.class, args);
} @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(SpringbootXiaocaijishuApplication.class);
} }

打包,配置Tomcat,启动,进入测试类,走起。

这里带两个别的知识,不属于本节的SpringBoot的。

我们嫌弃包的名字太长,不方便,我们可以在<build>标签下设置<finalName>来指定我们的war包名。

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

读取配置文件:

  有时候我们需要读取配置文件的数据,比如自动任务开关,还有一些静态的参数配置,我们可以这样来写

假设我们要读取application.yml的person数据。

先来改我们的pom文件。添加依赖

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

编写接收参数对象,在上面给予@ConfigurationProperties(prefix = "person")注解,prefix的值就是我们配置文件外层节点的值。

package com.springboot_xiaocaijishu.bean;

import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
import java.util.Map; @ConfigurationProperties(prefix = "person")
public class PersonBean { private String name;
private int age;
private Map<String, Object> address;
private List<String> hobbit; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public Map<String, Object> getAddress() {
return address;
} public void setAddress(Map<String, Object> address) {
this.address = address;
} public List<String> getHobbit() {
return hobbit;
} public void setHobbit(List<String> hobbit) {
this.hobbit = hobbit;
} }

编写我们的测试类

package com.springboot_xiaocaijishu.controller;

import com.springboot_xiaocaijishu.bean.PersonBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
@EnableConfigurationProperties(PersonBean.class)
public class UserController { @Autowired
private PersonBean personBean; @GetMapping("getPerson")
public PersonBean getPersonBean(){
return personBean;
} }

测试走起,看结果。

 SelectCompent:(Select过滤器)

  以前我们的项目都有web.xml来配置我们的Servlet,现在没有了,我们来看一下配置,我们先创建一个ServletConifg类

ServletConifg类

package com.springboot_xiaocaijishu.servlet;

import com.springboot_xiaocaijishu.controller.ServletController;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class ServletConifg{ @Bean
public ServletRegistrationBean addServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ServletController(),"/hello_servlet");
return servletRegistrationBean;
}
}

编写一个ServletController类

package com.springboot_xiaocaijishu.controller;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException; public class ServletController extends HttpServlet { protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("hello Servlet");
} protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
}

这时我们启动项目,访问http://localhost:8080/hello_servlet就可以跳转到我们的Servlet下,有了Servlet,我们来添加过滤器吧。添加一个CustomFilter类。

CustomFilter类

package com.springboot_xiaocaijishu.CustomFilter;

import javax.servlet.*;
import java.io.IOException; public class CustomFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("CustomFilter的doFilter方法");
filterChain.doFilter(servletRequest, servletResponse);
} @Override
public void destroy() {
System.out.println("destroy");
}
}

将我们我Filter注册到Servlet中去,回到我们的ServletConifg类中,添加这样的代码。

/**
* 注册一个filter
* @return
*/
@Bean
public FilterRegistrationBean<CustomFilter> filterFilterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new CustomFilter());
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}

拦截器:

  定义一个CustomInterceptor类,实现HandlerInterceptor类。后期我会说下HandlerInterceptor类内部的源码。

package com.springboot_xiaocaijishu.CustomInterceptor;

import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Component
public class CustomInterceptor implements HandlerInterceptor { /**
* 方法执行之前
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {
System.out.println("preHandle");
return true;
} /**
* 调用目标方法之后,渲染视图之前
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
System.out.println("postHandle"); } /**
* 渲染视图之后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
System.out.println("afterCompletion");
}
}

添加WebConifg类,注册我们的拦截器

package com.springboot_xiaocaijishu.servlet;

import com.springboot_xiaocaijishu.CustomInterceptor.CustomInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration
public class WebConifg implements WebMvcConfigurer { @Autowired
private CustomInterceptor CustomInterceptor; /**
* 注册拦截器
* @param registry
*/
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(CustomInterceptor).addPathPatterns("/**").excludePathPatterns("/login","/");
}
}

东西实在太多了,有点弄不完了,代码还忘记保留了,下次我一起传代码吧,下次说一下我们继承那些三方插件吧~! 

最进弄了一个公众号,小菜技术,欢迎大家的加入

三天讲透SpringBoot-初识基础使用的更多相关文章

  1. 从SpringBoot到SpringCloudAlibaba简明教程(一):初识SpringBoot及其基础项目构建

    前言 Spring框架的大名想必大家早已如雷贯耳,我们来看一下springboot诞生的初衷,以及它在springframe的基础上解决了哪些痛点. 很久以前,J2EE还是java企业级应用的标准规范 ...

  2. 终于有人把O2O、C2C、B2B、B2C的区别讲透了!

    终于有人把O2O.C2C.B2B.B2C的区别讲透了! 一.O2O.C2C.B2B.B2C的区别在哪里? O2O是online to offline分为四种运营模式: 1.online to offl ...

  3. 终于有人把Elasticsearch原理讲透了!

    终于有人把Elasticsearch原理讲透了! http://developer.51cto.com/art/201904/594615.htm 小史是一个非科班的程序员,虽然学的是电子专业,但是通 ...

  4. (转)终于有人把Elasticsearch原理讲透了!

    终于有人把Elasticsearch原理讲透了! 小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 来源:互联网侦察 | 2019-04-08 ...

  5. SpringBoot之基础入门-专题一

    SpringBoot之基础入门-专题一 一.Spring介绍 1.1.SpringBoot简介 在初次学习Spring整合各个第三方框架构建项目的时候,往往会有一大堆的XML文件的配置,众多的dtd或 ...

  6. SpringBoot初识(一)

    一.什么是SpringBoot 最近几年,微服务的概念越来越火.而相信大家在搜索微服务时,映入眼帘的首先就是SpringBoot以及SpringCloud.SpringCloud提供的一套完整的微服务 ...

  7. Oracle知识梳理(三)操作篇:SQL基础操作汇总

    Oracle知识梳理(三)操作篇:SQL基础操作汇总 一.表操作 1.表的创建(CREATE TABLE): 基本语句格式:       CREATE TABLE  table_name ( col_ ...

  8. 面试准备——(三)Selenium(1)基础问题及自动化测试

    转载:https://www.cnblogs.com/lesleysbw/p/6413880.html 面试准备——(三)Selenium(1)基础问题及自动化测试   滴滴面试: 1. 自己负责哪部 ...

  9. 【SpringBoot】SpringBoot的基础,全面理解bean的生命周期

    前言 前段时间直接上手使用springboot开发了一个数据平台的后台部分,但是自身对于springboot的原理和过程还不是很清晰,所以反过来学习下springboot的基础. 大家都知道sprin ...

随机推荐

  1. Codeforces 889F Letters Removing(二分 + 线段树 || 树状数组)

    Letters Removing 题意:给你一个长度为n的字符串,然后进行m次删除操作,每次删除区间[l,r]内的某个字符,删除后并且将字符串往前补位,求删除完之后的字符串. 题解:先开80个set ...

  2. CodeForces 834D The Bakery

    The Bakery 题意:将N个数分成K块, 每块的价值为不同数字的个数, 现在求总价值最大. 题解:dp[i][j] 表示 长度为j 且分成 i 块的价值总和. 那么 dp[i][j] = max ...

  3. lightoj 1201 - A Perfect Murder(树形dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1201 题解:简单的树形dp,dp[0][i]表示以i为根结点不傻i的最多有多少 ...

  4. CSU 1804: 有向无环图 拓扑排序 图论

    1804: 有向无环图 Submit Page   Summary   Time Limit: 5 Sec     Memory Limit: 128 Mb     Submitted: 716    ...

  5. C语言实现二级指针表示字符串数组

    头文件: #include<stdlib.h> #include<stdio.h> #include<string.h> 函数原型: char ** createB ...

  6. HashMap和ConcurrentHashMap的区别,HashMap的底层源码

    HashMap本质是数组加链表,根据key取得hash值,然后计算出数组下标,如果多个key对应到同一个下标,就用链表串起来,新插入的在前面. ConcurrentHashMap在HashMap的基础 ...

  7. Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则

    Spring Cloud Alibaba | Sentinel:分布式系统的流量防卫兵动态限流规则 前面几篇文章较为详细的介绍了Sentinel的使用姿势,还没看过的小伙伴可以访问以下链接查看: &l ...

  8. 代码整洁 vs 代码肮脏

    写出整洁的代码,是每个程序员的追求.<clean code>指出,要想写出好的代码,首先得知道什么是肮脏代码.什么是整洁代码:然后通过大量的刻意练习,才能真正写出整洁的代码. WTF/mi ...

  9. Linux 笔记 - 特殊权限

    博客地址:http://www.moonxy.com 一.前言 Linux 中使用权限的时候,一般都是使用 3 位数,比如,777.755.666.644 等,其实在最前面还有一位,那就是特殊权限,也 ...

  10. 05.Django基础五之django模型层(一)单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...