侧边栏壁纸
博主头像
落叶人生博主等级

走进秋风,寻找秋天的落叶

  • 累计撰写 130562 篇文章
  • 累计创建 28 个标签
  • 累计收到 9 条评论
标签搜索

目 录CONTENT

文章目录

Spring Boot学习笔记(超详细)

2022-07-09 星期六 / 0 评论 / 0 点赞 / 39 阅读 / 17309 字

一,spring boot 入门1、Spring Boot 简介简化Spring应用开发的一个框架;整个Spring技术栈的一个大整合;J2EE开发的一站式解决方案;2、微服务2014,martin

一,spring boot 入门

1、Spring Boot 简介

.

简化Spring应用开发的一个框架;
整个Spring技术栈的一个大整合;
J2EE开发的一站式解决方案;

.

2、微服务

2014,martin fowler

微服务:架构风格(服务微化)

一个应用应该是一组小型服务;可以通过HTTP的方式进行互通;

单体应用:ALL IN ONE

微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元;

3、环境准备

环境约束

–jdk1.8:Spring Boot 推荐jdk1.7及以上;java version “1.8.0_112”

–maven3.x:maven 3.3以上版本;Apache Maven 3.3.9 

–IntelliJIDEA2017:IntelliJ IDEA 2017.2.2 x64、STS

–SpringBoot 1.5.9.RELEASE:1.5.9;

统一环境; 

1、MAVEN设置;

给maven 的settings.xml配置文件的profiles标签添加

<profile>  <id>jdk-1.8</id>  <activation>    <activeByDefault>true</activeByDefault>    <jdk>1.8</jdk>  </activation>  <properties>    <maven.compiler.source>1.8</maven.compiler.source>    <maven.compiler.target>1.8</maven.compiler.target>    <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>  </properties></profile> 

2、IDEA设置

整合maven进来;

4、Spring Boot HelloWorld

一个功能:

浏览器发送hello请求,服务器接受请求并处理,响应Hello World字符串;

1、创建一个maven工程;(jar)

2、导入spring boot相关的依赖

    <parent>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-parent</artifactId>        <version>1.5.9.RELEASE</version>    </parent>    <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>    </dependencies> 

3、编写一个主程序;启动Spring Boot应用

 /** *  @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */@SpringBootApplicationpublic class HelloWorldMainApplication {    public static void main(String[] args) {        // Spring应用启动起来        SpringApplication.run(HelloWorldMainApplication.class,args);    }} 

4、编写相关的Controller、Service

@Controllerpublic class HelloController {    @ResponseBody    @RequestMapping("/hello")    public String hello(){        return "Hello World!";    }}  

5、运行主程序测试

6、简化部署

 <!-- 这个插件,可以将应用打包成一个可执行的jar包;-->    <build>        <plugins>            <plugin>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>            </plugin>        </plugins>    </build> 

5、Hello World探究

1、POM文件

1、父项目

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>1.5.9.RELEASE</version></parent>他的父项目是<parent>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-dependencies</artifactId>  <version>1.5.9.RELEASE</version>  <relativePath>../../spring-boot-dependencies</relativePath></parent>他来真正管理Spring Boot应用里面的所有依赖版本;  

Spring Boot的版本仲裁中心;

以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)

2、启动器

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

spring-boot-starter-web:

spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件;

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器 

2、主程序类,主入口类

/** *  @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用 */@SpringBootApplicationpublic class HelloWorldMainApplication {    public static void main(String[] args) {        // Spring应用启动起来        SpringApplication.run(HelloWorldMainApplication.class,args);    }}  

@SpringBootApplication: Spring Boot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用;

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFilters = {      @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),      @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })public @interface SpringBootApplication { 

@SpringBootConfiguration:Spring Boot的配置类;

​ 标注在某个类上,表示这是一个Spring Boot的配置类;

@Configuration:配置类上来标注这个注解;

​ 配置类 ----- 配置文件;配置类也是容器中的一个组件;@Component

@EnableAutoConfiguration:开启自动配置功能;

​ 以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自动配置功能;这样自动配置才能生效;

@AutoConfigurationPackage@Import(EnableAutoConfigurationImportSelector.class)public @interface EnableAutoConfiguration { 

@AutoConfigurationPackage:自动配置包 ​ @Import(AutoConfigurationPackages.Registrar.class): 

Spring的底层注解@Import,给容器中导入一个组件;导入的组件由AutoConfigurationPackages.Registrar.class;

将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;

@Import(EnableAutoConfigurationImportSelector.class);

给容器中导入组件?

EnableAutoConfigurationImportSelector:导入哪些组件的选择器;

将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;

会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作; ​ SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader) ==Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;==以前我们需要自己配置的东西,自动配置类都帮我们; J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar; 

6、使用Spring Initializer快速创建Spring Boot项目

1、IDEA:使用 Spring Initializer快速创建项目

IDE都支持使用Spring的项目创建向导快速创建一个Spring Boot项目;

选择我们需要的模块;向导会联网创建Spring Boot项目; 

默认生成的Spring Boot项目; 

  • 主程序已经生成好了,我们只需要我们自己的逻辑

  • resources文件夹中目录结构 

  • static:保存所有的静态资源; js css images;

  • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);

  • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置; 

2、STS使用 Spring Starter Project快速创建项目

二、配置文件

1、配置文件

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

•application.properties

•application.yml

配置文件的作用:修改SpringBoot自动配置的默认值;SpringBoot在底层都给我们自动配置好; 

YAML(YAML Ain’t Markup Language)

YAML A Markup Language:是一个标记语言  

YAML isn’t Markup Language:不是一个标记语言; 

标记语言:

以前的配置文件;大多都使用的是 xxxx.xml文件;

YAML:以数据为中心,比json、xml等更适合做配置文件;

YAML:配置例子

server:  port: 8081 

​ XML:

<server>	<port>8081</port></server> 

2、YAML语法:

1、基本语法

k:(空格)v:表示一对键值对(空格必须有);

空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的

server:    port: 8081    path: /hello 

属性和值也是大小写敏感;

2、值的写法

字面量:普通的值(数字,字符串,布尔)

k: v:字面直接来写;

字符串默认不用加上单引号或者双引号;

“”:双引号;不会转义字符串里面的特殊字符;特殊字符会作为本身想表示的意思

name: “zhangsan /n lisi”:输出;zhangsan 换行 lisi

‘’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数

name: ‘zhangsan /n lisi’:输出;zhangsan /n lisi

对象、Map(属性和值)(键值对):

 k: v:在下一行来写对象的属性和值的关系;注意缩进

​ 对象还是k: v的方式

friends:		lastName: zhangsan		age: 20 

行内写法:

friends: {lastName: zhangsan,age: 18} 

数组(List、Set):

用- 值表示数组中的一个元素

pets: - cat - dog - pig 

行内写法

pets: [cat,dog,pig] 

3、配置文件值注入

配置文件

person:    lastName: hello    age: 18    boss: false    birth: 2017/12/12    maps: {k1: v1,k2: 12}    lists:      - lisi      - zhaoliu    dog:      name: 小狗      age: 12 

javaBean:

/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; * */@Component@ConfigurationProperties(prefix = "person")public class Person {    private String lastName;    private Integer age;    private Boolean boss;    private Date birth;    private Map<String,Object> maps;    private List<Object> lists;    private Dog dog;  

我们可以导入配置文件处理器,以后编写配置就有提示了

<!--导入配置文件处理器,配置文件进行绑定就会有提示-->		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-configuration-processor</artifactId>			<optional>true</optional>		</dependency> 

1、properties配置文件在idea中默认utf-8可能会乱码

调整

2、@Value获取值和@ConfigurationProperties获取值比较

配置文件yml还是properties他们都能获取到值;

如果说,我们只是在某个业务逻辑中需要获取一下配置文件中的某项值,使用@Value;

如果说,我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@ConfigurationProperties;

3、配置文件注入值数据校验

@Component@ConfigurationProperties(prefix = "person")@Validatedpublic class Person {    /**     * <bean class="Person">     *      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>     * <bean/>     */   //lastName必须是邮箱格式    @Email    //@Value("${person.last-name}")    private String lastName;    //@Value("#{11*2}")    private Integer age;    //@Value("true")    private Boolean boss;    private Date birth;    private Map<String,Object> maps;    private List<Object> lists;    private Dog dog; 

4、@PropertySource&@ImportResource&@Bean

@PropertySource:加载指定的配置文件;

/** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定; *      prefix = "person":配置文件中哪个下面的所有属性进行一一映射 * * 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能; *  @ConfigurationProperties(prefix = "person")默认从全局配置文件中获取值; * */@PropertySource(value = {"classpath:person.properties"})@Component@ConfigurationProperties(prefix = "person")//@Validatedpublic class Person {    /**     * <bean class="Person">     *      <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>     * <bean/>     */   //lastName必须是邮箱格式   // @Email    //@Value("${person.last-name}")    private String lastName;    //@Value("#{11*2}")    private Integer age;    //@Value("true")    private Boolean boss;  

@ImportResource:导入Spring的配置文件,让配置文件里面的内容生效;

Spring Boot里面没有Spring的配置文件,我们自己编写的配置文件,也不能自动识别;

想让Spring的配置文件生效,加载进来;@ImportResource标注在一个配置类上

@ImportResource(locations = {"classpath:beans.xml"})导入Spring的配置文件让其生效 

不来编写Spring的配置文件

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">    <bean id="helloService" class="com.atguigu.springboot.service.HelloService"></bean></beans> 

SpringBoot推荐给容器中添加组件的方式;推荐使用全注解的方式

1、配置类**@Configuration**------>Spring配置文件

2、使用**@Bean**给容器中添加组件

/** * @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件 * * 在配置文件中用<bean><bean/>标签添加组件 * */@Configurationpublic class MyAppConfig {    //将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名    @Bean    public HelloService helloService02(){        System.out.println("配置类@Bean给容器中添加组件了...");        return new HelloService();    }} 

未完待续。。。

海量资料和更多精彩文章可以关注小编微信公众号:Java程序员聚集地

.
.

广告 广告

评论区