SpringBoot详解

文章目录第一个SpringBoot程序原理yaml给属性赋值的几种方法JSR303校验多环境切换多配置文件yaml的多文档块配置文件加载位置分析自动配置原理精髓SpringBoot Web开发静态资源导入首页如何定制Thymeleaf扩展使用SpringMVC全面接管SpringMVC员工管理系统首页实现页面国际化登录功能展示员工列表增加员工修改员工删除员工404回顾整合JDBC整合Druid数据源配置数据源配置Druid数据源监控整合Mybatis框架SpringSecurity认识SpringSecur
摘要由CSDN通过智能技术生成

第一个SpringBoot程序

jdk1.8

maven3.6.1

SpringBoot最新

IDEA

官方:提供了一个快速生成的网站,IDEA集成了这个网站(首选)

https://start.spring.io/

image-20220211155406931

image-20220211160114342

原理

https://mp.weixin.qq.com/s/hzRwZvjYSX-dy-9Drz94aQ

pom.xml

  • spring-boot-dependencies:核心依赖在父工程中
  • 我们在写入或者引入一些SpringBoot依赖时,不需要指定版本,就是因为有这些版本仓库

启动器

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

SpringBoot的启动场景,比如spring-boot-starter-web,就会自动导入web环境所有依赖

SpringBoot会将所有场景都变成启动器

需要什么功能,找到对应的启动器就可以

主程序

//标注这个类是一个SpringBoot的应用
@SpringBootApplication
public class Springboot01HelloworldApplication {
   

    public static void main(String[] args) {
   
        //将SpringBoot启动
        SpringApplication.run(Springboot01HelloworldApplication.class, args);
    }

}

注解

@SpringBootConfigurationSpringBoot的配置
    @Configuration:spring配置类
    	@Component:说明是个spring组件
@EnableAutoConfiguration:自动配置
    @AutoConfigurationPackage:自动配置包
    	@Import({
   Registrar.class)}:注册
    @Import({
   AutoConfigurationImportSelector.class}):自动配置导入选择

SpringApplication

这个类主要做了以下四件事情:

1、推断应用的类型是普通的项目还是Web项目

2、查找并加载所有可用初始化器 , 设置到initializers属性中

3、找出所有的应用程序监听器,设置到listeners属性中

4、推断并设置main方法的定义类,找到运行的主类

yaml

SpringBoot使用一个全局的配置文件 , 配置文件名称是固定的

  • application.properties

    • 语法结构 :key=value
  • application.yml

    • 语法结构 :key:空格 value
#普通的key-value
name: cc
#对象
student:
  name: cc
  age: 3
#行内写法
student2: {
   name: cc,age: 3}
#数组
pets:
  - cat
  - dog
  - pig
pets2: [cat,dog,pig]

给属性赋值的几种方法

用@value给实体类每个字段赋值,或者用properties文件关联,或者yaml文件关联:

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

1.实体类

@ConfigurationProperties(prefix = “person”):和配置文件赋值的对象绑定(给属性赋值)

@Data
@NoArgsConstructor
@AllArgsConstructor
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
   
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}

2.application.yaml

person:
  name: cc
  age: 3
  happy: false
  birth: 2022/02/12
  maps: {
   k1: v1,k2: v2}
  lists:
    - code
    - girl
    - music
  dog:
    name: 旺财
    age: 3

3.测试

@SpringBootTest
class Springboot02ConfigApplicationTests {
   

    @Autowired
    private Person person;
    @Test
    void contextLoads() {
   
        System.out.println(person);
    }
}

JSR303校验

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-validation --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-validation</artifactId>    <version>2.6.3</version></dependency>
@Validatedpublic class Person {
       @Email(message="邮箱格式错误")    private String name;

image-20220212143131336

多环境切换

多配置文件

我们在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

例如:

application-test.properties 代表测试环境配置

application-dev.properties 代表开发环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件

我们需要通过一个配置来选择需要激活的环境:

spring.profiles.active=dev#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试;

我们启动SpringBoot,就可以看到已经切换到dev下的配置了;

yaml的多文档块

和properties配置文件中一样,但是使用yml去实现不需要创建多个配置文件,更加方便了 !

server:  port: 8081 spring:  	profiles:    		active: prod #选择要激活那个环境块---server:  port: 8083spring:  	profiles: dev #配置环境的名称---server:  port: 8084spring:  	profiles: prod  #配置环境的名称

注意:如果yml和properties同时都配置了端口,并且没有激活其他环境 , 默认会使用properties配置文件的!

配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件:

优先级1:项目路径下的config文件夹配置文件优先级2:项目路径下配置文件优先级3:资源路径下的config文件夹配置文件优先级4:资源路径下配置文件

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载主配置文件;互补配置;

分析自动配置原理

我们以**HttpEncodingAutoConfiguration(Http编码自动配置)**为例解释自动配置原理;

//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;@Configuration //启动指定类的ConfigurationProperties功能;  //进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;  //并把HttpProperties加入到ioc容器中@EnableConfigurationProperties({HttpProperties.class}) //Spring底层@Conditional注解  //根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;  //这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效@ConditionalOnWebApplication(    type = Type.SERVLET)//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;@ConditionalOnClass({CharacterEncodingFilter.class})//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;  //如果不存在,判断也是成立的  //即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;@ConditionalOnProperty(    prefix = "spring.http.encoding",    value = {"enabled"},    matchIfMissing = true)public class HttpEncodingAutoConfiguration {    //他已经和SpringBoot的配置文件映射了    private final Encoding properties;    //只有一个有参构造器的情况下,参数的值就会从容器中拿    public HttpEncodingAutoConfiguration(HttpProperties properties) {        this.properties = properties.getEncoding();    }    //给容器中添加一个组件,这个组件的某些值需要从properties中获取@Bean@ConditionalOnMissingBean //判断容器没有这个组件?public CharacterEncodingFilter characterEncodingFilter() {    CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter();    filter.setEncoding(this.properties.getCharset().name());    filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST));    filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE));    return filter;}//。。。。。。。}

一句话总结 :根据当前不同的条件判断,决定这个配置类是否生效!

  • 一但这个配置类生效;这个配置类就会给容器中添加各种组件;
  • 这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
  • 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
  • 配置文件能配置什么就可以参照某个功能对应的这个属性类

精髓

1、SpringBoot启动会加载大量的自动配置类

2、我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中;

3、我们再来看这个自动配置类中到底配置了哪些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)

4、给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;

**xxxxAutoConfigurartion:自动配置类;**给容器中添加组件

xxxxProperties:封装配置文件中相关属性;

SpringBoot Web开发

静态资源导入

1、在SpringBoot中可以使用以下方式处理静态资源:

  • webjars 访问方式:localhost:8080/webjars/
  • public,static,/**,resources 访问方式:localhost:8080/

2、优先级

resources > static(默认)> public

首页如何定制

新建一个 index.html ,在我们上面的3个目录中任意一个

Thymeleaf

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

我们首先得按照SpringBoot的自动配置原理看一下我们这个Thymeleaf的自动配置规则,在按照那个规则,我们进行使用。

我们去找一下Thymeleaf的自动配置类:ThymeleafProperties

@ConfigurationProperties(    prefix = "spring.thymeleaf")public class ThymeleafProperties {
       private static final Charset DEFAULT_ENCODING;    public static final String DEFAULT_PREFIX = "classpath:/templates/";    public static final String DEFAULT_SUFFIX = ".html";    private boolean checkTemplate = true;    private boolean checkTemplateLocation = true;    private String prefix = "classpath:/templates/";    private String suffix = ".html";    private String mode = "HTML";    private Charset encoding;}

我们可以在其中看到默认的前缀和后缀!

我们只需要把我们的html页面放在类路径下的templates下,thymeleaf就可以帮我们自动渲染了。

使用thymeleaf什么都不需要配置,只需要将他放在指定的文件夹下即可!

@RequestMapping("/t1")public String test1(Model model){
       //存入数据    model.addAttribute("msg","Hello,Thymeleaf");    //classpath:/templates/test.html    return "test";}
<!DOCTYPE html><html lang="en" xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8">    <title>Title</title></head><body><!--所有的html元素都可以被thymeleaf替换接管--><div th:text="${msg}"></div></body></html>

注意命名空间:

 xmlns:th="http://www.thymeleaf.org"

图片

image-20220213182013121

扩展使用SpringMVC

我们要做的就是编写一个@Configuration注解类,并且类型要为WebMvcConfigurer,还不能标注@EnableWebMvc注解;我们去自己写一个;我们新建一个包叫config,写一个类MyMvcConfig;

//应为类型要求为WebMvcConfigurer,所以我们实现其接口//可以使用自定义类扩展MVC的功能@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {    @Override    public void addViewControllers(ViewControllerRegistry registry) {        // 浏览器发送/test , 就会跳转到test页面;        registry.addViewController("/test").setViewName("test");    }}

全面接管SpringMVC

官方文档:

If you want to take complete control of Spring MVCyou can add your own @Configuration annotated with @EnableWebMvc.

全面接管即:SpringBoot对SpringMVC的自动配置不需要了,所有都是我们自己去配置!

只需在我们的配置类中要加一个@EnableWebMvc。

我们发现所有的SpringMVC自动配置都失效了!回归到了最初的样子;

当然,我们开发中,不推荐使用全面接管SpringMVC

总结一句话:@EnableWebMvc将WebMvcConfigurationSupport组件导入进来了;

而导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能!

在SpringBoot中会有非常多的扩展配置,只要看见了这个,我们就应该多留心注意~

员工管理系统

首页实现

1、config包下编写MyMvcConfig类

@Configurationpublic class MyMvcConfig implements WebMvcConfigurer {
       @Override    public void addViewControllers(ViewControllerRegistry registry) {
           registry.addViewController("/").setViewName("index");        registry.addViewController("/index.html").setViewName("index");    }}

2、静态资源用thymeleaf接管

xmlns:th="http://www.thymeleaf.org"
<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">

3、application.properties

#关闭模板引擎的缓存spring.thymeleaf.cache=false

页面国际化

1、编写Login bundle

在resources文件夹下建i18n文件夹

image-20220213180829338

可视化编写

image-20220213180906983

2、静态资源用thymeleaf接管

th:text="#{login.tip}"

[[#{login.remember}]]

<body class="text-center">   <form class="form-signin" action="dashboard.html">      <img class="mb-4" th:src="@{/img/bootstrap-solid.svg}" alt="" width="72" height="72">      <h1 class="h3 mb-3 font-weight-normal" th:text="#{login.tip}">Please sign in</h1>      <input type="text" class="form-control" th:placeholder="#{login.username}" required="" autofocus="">      <input type="password
  • 4
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值