【Spring Boot 1】入门篇


3、J2EE开发的一站式解决方案;


二、使用Spring Boot有什么好处

====================

其实就是简单、快速、方便!

平时如果我们需要搭建一个Spring Web项目的时候需要怎么做呢?

  • 配置web.xml,加载spring和springMVC

  • 配置数据库连接、配置spring事务

  • 配置加载配置文件的读取,开启注解

  • 配置日志文件

  • 配置完成之后部署Tomcat调试

现在非常流行微服务,如果我这个项目仅仅只是需要发送一个邮件,如果我的项目仅仅是生产一个积分;我都需要这样折腾一遍!

但是如果使用 Spring Boot 呢?

很简单,我仅仅只需要非常少的几个配置就可以迅速方便的搭建起来一套 Web 项目或者是构建一个微服务!

使用 Spring Boot 到底有多爽,用下面这幅图来表达

三、简单实例

======

1、IDEA构建项目


(1) 选择 File -> New —> Project… 弹出新建项目的框

(2) 选择 Spring Initializr,Next 也会出现上述类似的配置界面,Idea 帮我们做了集成

(3) 填写相关内容后,点击 Next 选择依赖的包再点击 Next,最后确定信息无误点击 Finish。

2、项目结构介绍


如上图所示,Spring Boot 的基础结构共三个文件:

  • src/main/java 程序开发以及主程序入口

  • src/main/resources 配置文件

  • src/test/java 测试程序

3、实现Spring Boot HelloWorld


(1)maven配置

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

jdk-1.8

true

1.8

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>

(2)导入spring boot相关的依赖

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

org.springframework.boot

spring-boot-starter-web

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

/**

  • @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用

*/

@SpringBootApplication

public class HelloWorldMainApplication {

public static void main(String[] args) {

// Spring应用启动起来

SpringApplication.run(HelloWorldMainApplication.class,args);

}

}

(4)编写相关的Controller、Service

@Controller

public class HelloController {

@ResponseBody

@RequestMapping(“/hello”)

public String hello(){

return “Hello World!”;

}

}

@RestController 的意思就是 Controller 里面的方法都以json格式输出,不用再写什么jackjson配置的了。

(5)运行主程序测试

(6)如何做单元测试

打开的 src/test/ 下的测试入口,编写简单的 http 请求来测试;使用 mockmvc 进行,利用 MockMvcResultHandlers.print() 打印出执行结果。

@RunWith(SpringRunner.class)

@SpringBootTest

public class HelloTests {

private MockMvc mvc;

@Before

public void setUp() throws Exception {

mvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();

}

@Test

public void getHello() throws Exception {

mvc.perform(MockMvcRequestBuilders.get(“/hello”).accept(MediaType.APPLICATION_JSON))

.andExpect(status().isOk())

.andExpect(content().string(equalTo(“Hello World”)));

}

}

(7)简化部署

org.springframework.boot

spring-boot-maven-plugin

将这个应用打成jar包,直接使用java -jar的命令进行执行

4、Hello World探究


(1)POM文件

pom.xml 文件中默认有两个模块:

spring-boot-starter 核心模块,包括自动配置支持、日志和YAML,如果引入了 spring-boot-starter-web web模块可以去掉此配置,因为 spring-boot-starter-web 自动依赖了spring-boot-starter。

spring-boot-starter-test 测试模块,包括JUnit、Hamcrest、Mockito。

父项目

org.springframework.boot

spring-boot-starter-parent

1.5.9.RELEASE

//他的父项目是

org.springframework.boot

spring-boot-dependencies

1.5.9.RELEASE

…/…/spring-boot-dependencies

//他来真正管理Spring Boot应用里面的所有依赖版本;

启动器

org.springframework.boot

spring-boot-starter-web

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

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

(2)主程序类,主入口类

/**

  • @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用

*/

@SpringBootApplication

public 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);就是给容器中导入这个场景需要的所有组件,并配置好这些组件;        ![自动配置类](images/搜狗截图20180129224104.png)

有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;

SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader);

Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们;

J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-1.5.9.RELEASE.jar;

四、配置文件

======

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

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
  • 数组(List、Set):

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

pets:

  • cat

  • dog

  • pig

3、配置文件值注入


(1)yml配置文件

person:

lastName: hello

age: 18

boss: false

birth: 2017/12/12

maps: {k1: v1,k2: 12}

lists:

  • lisi

  • zhaoliu

dog:

name: 小狗

age: 12

(2)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 lists;

private Dog dog;

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

groupId>org.springframework.boot

spring-boot-configuration-processor

true

(3)@Value获取值和@ConfigurationProperties获取值比较

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

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

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

(4)配置文件注入值数据校验

@Component

@ConfigurationProperties(prefix = “person”)

@Validated

public class Person {

/**

  •  <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
    

*/

//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 lists;

private Dog dog;

(5)@PropertySource&@ImportResource&@Bean

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

/**

  • 将配置文件中配置的每一个属性的值,映射到这个组件中

  • @ConfigurationProperties:告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定;

  •  prefix = "person":配置文件中哪个下面的所有属性进行一一映射
    
  • 只有这个组件是容器中的组件,才能容器提供的@ConfigurationProperties功能;

  • @ConfigurationProperties(prefix = “person”)默认从全局配置文件中获取值;

*/

@PropertySource(value = {“classpath:person.properties”})

@Component

@ConfigurationProperties(prefix = “person”)

//@Validated

public class Person {

/**

  •  <property name="lastName" value="字面量/${key}从环境变量、配置文件中获取值/#{SpEL}"></property>
    

*/

//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”>

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

  • 配置类**@Configuration**------>Spring配置文件

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

/**

  • @Configuration:指明当前类是一个配置类;就是来替代之前的Spring配置文件

  • 在配置文件中用标签添加组件

*/

@Configuration

public class MyAppConfig {

//将方法的返回值添加到容器中;容器中这个组件默认的id就是方法名

@Bean

public HelloService helloService02(){

System.out.println(“配置类@Bean给容器中添加组件了…”);

return new HelloService();

}

}

4、配置文件占位符


(1)随机数

r a n d o m . v a l u e 、 {random.value}、 random.value{random.int}、${random.long}

r a n d o m . i n t ( 10 ) 、 {random.int(10)}、 random.int(10){random.int[1024,65536]}

(2)占位符获取之前配置的值,如果没有可以是用:指定默认值

person.last-name=张三${random.uuid}

person.age=${random.int}

person.birth=2017/12/15

person.boss=false

person.maps.k1=v1

person.maps.k2=14

person.lists=a,b,c

person.dog.name=${person.hello:hello}_dog

person.dog.age=15

5、Profile


(1)多Profile文件

我们在主配置文件编写的时候,文件名可以是   application-{profile}.properties/yml

默认使用application.properties的配置;

(2)yml支持多文档块方式

server:

port: 8081

spring:

profiles:

active: prod


server:

port: 8083

spring:

profiles: dev


server:

port: 8084

spring:

profiles: prod #指定属于哪个环境

(3)激活指定profile

  • 在配置文件中指定  spring.profiles.active=dev

  • ​命令行:

​        java -jar spring-boot-02-config-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev;

​        可以直接在测试的时候,配置传入命令行参数

  • 虚拟机参数;

​        -Dspring.profiles.active=dev

6、配置文件加载位置


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

–file:./config/

–file:./

–classpath:/config/

–classpath:/

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

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

==我们还可以通过spring.config.location来改变默认的配置文件位置==

**项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定配置文件的新位置;指定配置文件和默认加载的这些配置文件共同起作用形成互补配置;**

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --spring.config.location=G:/application.properties

7、外部配置加载顺序


SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置

(1)命令行参数

所有的配置都可以在命令行上进行指定

java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087  --server.context-path=/abc

多个配置用空格分开; --配置项=值

(2)来自java:comp/env的JNDI属性

(3)Java系统属性(System.getProperties())

(4)操作系统环境变量

(5)RandomValuePropertySource配置的random.*属性值

由jar包外向jar包内进行寻找;优先加载带profile

(6)jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件

(7)jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件

再来加载不带profile

(8)jar包外部的application.properties或application.yml(不带spring.profile)配置文件

(9)jar包内部的application.properties或application.yml(不带spring.profile)配置文件

(10)@Configuration注解类上的@PropertySource

(11)通过SpringApplication.setDefaultProperties指定的默认属性

所有支持的配置加载来源;

[参考官方文档]

8、自动配置原理


配置文件到底能写什么?怎么写?自动配置原理;

[配置文件能配置的属性参照]

(1)SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration

(2)@EnableAutoConfiguration 作用:

  • 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?

  • 可以查看selectImports()方法的内容;

  • List configurations = getCandidateConfigurations(annotationMetadata,      attributes);获取候选的配置

SpringFactoriesLoader.loadFactoryNames()

扫描所有jar包类路径下 META-INF/spring.factories

把扫描到的这些文件的内容包装成properties对象

从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中

将 类路径下  META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;

每一个这样的  xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
Loader.loadFactoryNames()

扫描所有jar包类路径下 META-INF/spring.factories

把扫描到的这些文件的内容包装成properties对象

从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中

将 类路径下  META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;

每一个这样的  xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-ZcBVSm0r-1713536302275)]

[外链图片转存中…(img-4X2Ko4p3-1713536302276)]

[外链图片转存中…(img-80yioclC-1713536302279)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

[外链图片转存中…(img-hJmXl9JB-1713536302280)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-39dOBJJ9-1713536302283)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-LAF2E6YW-1713536302285)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 30
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值