欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot(一)

程序员文章站 2022-04-19 18:39:24
...

SpringBoot基础

第一个SpringBoot程序

  • jdk1.8

  • maven 3.5

  • springboot

  • IDEA

在IDEA中直接创建项目

New Project→Spring Initializr→Deault

注意事项

创建的springboot项目是一个maven项目,最好借用阿里云的镜像来新建,不然下载会很慢。

项目细节

项目有一个程序的主入口,运行的时候也是需要运行它;注意,我们写的代码的包存放的位置需要放置在许主程序同一个目录下。当写好一个项目时,还可以将项目打成jar包。

原理

自动配置(1):

pom.xml

  • spring-boot-dependencies:核心依赖在父工程

  • 在引入springboot的依赖时候不需要指定版本,因为有版本仓库

  • 启动器:就是springboot的启动场景

  • 这个是web启动器,会自动配置web,嵌入tomcat等

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  • springboot会将所有的功能场景,都变成一个个的启动器。
  • 我们要使用某些功能,就只需要找到对应的启动器就可以了

主程序入口:

@SpringBootApllication注解标注这个类是一个springboot的应用

package cn.zhku.helloworld;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloworldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloworldApplication.class, args);
    }

}

注解:

@SpringBootConfiguration:springboot的配置
@Confihuration:spring配置类
@Component:说明这也是一个spring的组件
	
@EnableAutoConfiguration:自动配置
@AutoConfihurationPackage:自动配置包
@Import({Registrar.class}):自动配置‘包注册’
@Import({AutoConfigurationImportSelector.class}):自动配置导入选择	

底层有很多自动配置类,通过properies去遍历读取,但是不是所有都会立即生效,需要导入对应的starter才有作用,因为要满足注解中的条件才会生效。

springboot所有的自动配置都是在启动的时候扫描并加载,:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入对应的starter,就有相应的启动器,有了启动器,我们的自动装配才会生效然后就配置成功。

  1. springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值。
  2. 将这些自动配置的类导入容器,自动配置就会生效。
  3. 以前需要手动配置的东西,现在springboot都帮我们做了。
  4. 整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.3.RELEASE.jar这个包下。
  5. 他会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器
  6. 容器中也会存在非常多…AutoConfiguration的文件,就是这些类给容器中导入了这个场景所需要的的所有组件,并自动配置。
  7. 有了自动配置类,免去了我们手动编写配置注入功能组件等工作

yaml语法:

凡是在key后面都要加一个空格

  • key:空格value
  • key:空格{对象}
  • key:空格[]

yaml可以给实体类赋值,避免了以前通过properties的配置方法,注意格式就行。配置好了还需要在实体类中添加一个注解@ConfigurationProperties(prefix = “person”),prefix=配置的名称,这里为person;还需要注意的是yaml配置中的key要和实体类定义的属性名相同;key后面的value值可以写spring的el表达式。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JabKNqur-1590020744467)(D:\MyMD\5.PNG)]

person:
  name: zhangsan
  age: 15
  happy: true
  birth: 2020/5/19
  maps: {k1: v1,k2: v2}
  list: [l1,l2]
  dog:
    name: dd
    age: 2

自动配置原理(2)

在springboot底层中有很多的配置类,存放在sping-boot-autoconfigure包下的spring.factories,尝试点进去一个看一下,这里点击了HttpEncodingAutoConfiguration,发现里面有一个@EnableConfigurationProperties注解,这个注解的意思是开启配置,以properties的形式去读取里面的配置类,这里的配置是ServerProperties。点进去查看发现它有一个@ConfigurationProperties(prefix = “server”, ignoreUnknownFields = true)注解,那这个注解就比较熟悉了,就是我们上面在自己配置一个类的时候需要加上的注解。所以说springboot帮我们进行自动配置的底层原理就是如此,和我们所做的是一样的,但是有些自动配置类(xxxAutoConfiguration)是没有生效的,因为条件不满足。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UOVDa5VO-1590020744469)(D:\MyMD\1.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1MGeiaU-1590020744471)(D:\MyMD\2.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dZN807Ri-1590020744473)(D:\MyMD\3.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gFOBBwpp-1590020744474)(D:\MyMD\4.PNG)]

自动装配原理总结:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DiLkeFxw-1590020744476)(D:\MyMD\6.PNG)]

SpringBoot Web开发

静态资源导入:

springboot中的静态资源可存放的目录有四个,优先级:resources>static(默认)>public

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cR2wGLBR-1590020744477)(D:\MyMD\8.PNG)]

原理在配置类中规定了:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HS6f2fMh-1590020744478)(D:\MyMD\7.PNG)]

首页定制:

首页的名称要命名为index.html,位置要存放在静态资源目录下。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y2B8iRB6-1590020744479)(D:\MyMD\9.PNG)]

模板引擎:

springboot中采用thymeleaf模板引擎,使用前需要先导入依赖。

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

thymeleaf是嵌入在html中的,使用时需要导入约束。

<html lang="en" xmlns:th="http://www.thymeleaf.org">

thymeleaf的用法其实就是在任何的属性前面都可以加上th:,例如a标签中的href属性可以变成th:href,那么属性值就需要用@{路径},一般来说@{/},里面的斜杠代表类路径下(resources)。

<link th:href="@{/css/bootstrap.min.css}" rel="stylesheet">

常见的thymeleaf属性写法(一般写在标签内):th:text="${xxx}"、th:src="@{路径}"、th:href="@{路径}",一般地址都要以@打头,th:each="a : []"[[]]{数组}[]"遍历数组等等。如果写在标签外的话就要先用[[ ]],括住,里面再用取出来。

thymeleaf可以通过th:fragment抽取页面相同的代码出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LBua5uY-1590020744480)(D:\MyMD\11.PNG)]

调用的时候可以用th:replace=""

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2LhitVW-1590020744480)(D:\MyMD\12.PNG)]

在thymeleaf中常用三元运算符

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5rerRNEi-1590020744481)(D:\MyMD\13.PNG)]

还可以从java中获取的Date转为自己想要的格式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CcOlfurk-1590020744482)(D:\MyMD\14.PNG)]

MVC配置原理:

springboot中已经帮我们配置好了springmvc,例如已经有默认的视图解析器等等。根据官方文档中的一段话,如果我们想在mvc中添加一些其他的功能(扩展),那么只需要自己先写一个配置类,注意要加上@Configuration注解,这样类才会被标识为配置类;然后配置类需要实现WebMvcConfigurer接口,例如如果想添加一个视图解析器的话,先定义好视图解析器,定义视图解析器需要实现ViewResolver接口,然后在配置类中通过方法来返回该视图解析器,最后再在方法上添上@Bean注解,加上这个注解之后,自定义的视图解析器就会被springboot装配起来,放进容器中。在底层代码里,会遍历容器中的所有的视图解析器(原本也存在视图解析器),然后挑选出最好的那个出来用。

除了功能的扩展还可以重写原本的功能,查看可以重写的方法,然后再添加自己的代码就行。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-caKstHp5-1590020744483)(D:\MyMD\10.PNG)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-03Jvl0pO-1590020744483)(C:\Users\17250\AppData\Roaming\Typora\typora-user-images\image-20200519191403773.png)]

国际化操作:

public class MyLocaleRessolver implements LocaleResolver {//编写一个国际化组件类
    @Override
    public Locale resolveLocale(HttpServletRequest httpServletRequest) {
        String language = httpServletRequest.getParameter("l");
        Locale locale = Locale.getDefault();//如果没有就是用默认
        //如果请求的连接携带了国际化的参数
        if (!StringUtils.isEmpty(language)){
            //zh_CN
            String[] split = language.split("_");
            //国家地区
            locale = new Locale(split[0], split[1]);
        }
        return locale;
    }

    @Override
    public void setLocale(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Locale locale) {

    }
}
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //配置初始页面
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
    }

    //自定义的国际化组件。加入容器中
    @Bean
    public LocaleResolver localeResolver(){
        return new MyLocaleRessolver();
    }
}

ontroller("/").setViewName(“index”);
registry.addViewController("/index.html").setViewName(“index”);
}

//自定义的国际化组件。加入容器中
@Bean
public LocaleResolver localeResolver(){
    return new MyLocaleRessolver();
}

}