什么是Spring
Spring是一个开源框架,2003年兴起的一个轻量级的Java开发框架,作者:Rod Johnson。
Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。
Spring是如何简化Java开发的
为了降低Java开发的复杂性,Spring采用了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程;
2、通过IOC,依赖注入(DI)和面向接口实现松耦合;
3、基于切面(AOP)和惯例进行声明式编程;
4、通过切面和模板减少样式代码;
什么是SpringBoot
学过javaweb的同学就知道,开发一个web应用,从最初开始接触Servlet结合Tomcat,跑出一个Hello World程序,是要经历特别多的步骤;后来有了框架Struts,再后来的SpringMVC,到了现在的SpringBoot,过一两年又会有其他web框架出现。什么是Springboot呢,就是一个javaweb的开发框架,和SpringMVC类似,对比其他javaweb框架的好处,官方说是简化开发,约定大于配置,you can “just run”,能迅速的开发web应用,几行代码开发一个http接口。
Java企业级应用->J2EE->spring->springboot的过程
Spring Boot 基于 Spring 开发,Spirng Boot 本身并不提供 Spring 框架的核心特性以及扩展功能,只是用于快速、敏捷地开发新一代基于 Spring 框架的应用程序。也就是说,它并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。Spring Boot 以约定大于配置的核心思想,默认帮我们进行了很多设置,多数 Spring Boot 应用只需要很少的 Spring 配置。同时它集成了大量常用的第三方库配置(例如 Redis、MongoDB、Jpa、RabbitMQ、Quartz 等等),Spring Boot 应用中这些第三方库几乎可以零配置的开箱即用。
简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring boot整合了所有的框架 。
SpringBoot的主要优点:
- 为所有Spring开发者更快入门
- 开箱即用,提供各种默认配置来简化项目配置
- 内嵌式容器简化Web项目
- 没有冗余代码生成和XML配置的要求
第一个SpringBoot程序
第一步,新建Spring Initializr
第二步,选择自己的JDK
第三步
最后Finish.
SpringBoot自带内置Tomcat,新建项目等依赖下载完就可以直接运行。默认端口8080
运行结果
编写controller层
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello(){
// 调用业务,接收前端的参数!
return "hello world";
}
}
原理
自动装配:
pom.xml
- spring-boot-dependencies:核心依赖在父工程里
- 我们在写或者引入一些SpringBoot依赖得时候,不需要指定版本就因为有这些版本仓库
启动器
- 启动器:说白了就是SpringBoot得启动场景
- 比如Spring-boot-starter-web,他就会帮我们自动导入web环境所有得依赖!
- springboot会将所有的功能场景,都变成一个个的启动器
- 我们要使用什么功能,就只需要找到对应的启动器就可以了(starter)
主程序
@SpringBootApplication
//@SpringBootApplication:标记这个类是一个springboot的应用
public class HellospringbootApplication {
public static void main(String[] args) {
// 将springboot应用启动
SpringApplication.run(HellospringbootApplication.class, args);
}
}
自动配置结论:Springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只要导入了对应的starter,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就配置成功!
1、springboot在启动的时候,从类路径下 /META-INF/spring.factories获取指定的值;
2、将这些自动配置的类导入容器,自动配置就会生效,帮我进行自动装配!
3、以前我们需要自动配置的东西,现在springboot帮我们做了
4、整合javaEE,解决方案和自动配置的东西都在spring-boot-autoconfigure-2.2.0。RELEASE.jar这个包下
5、它会把所有需要导入的组件,以类名的方式返回,这些组件就会被添加到容器;
6、容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景需要的所有组件。
了解下主启动类怎么运行
这个类主要做了以下四件事情:
- 推断应用的类型是普通的项目还是Web项目
- 查找并加载所有可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法的定义类,找到运行的主类
YAML文件
# key: value
# 对空格的要求十分严格!
# 注入到配置类汇中!
name: qinjiang
# 对象
student:
name: qinjiang
age: 3
# 行内写法
student: {name: qinjiang,age: 3}
# 数组
pets:
- cat
- dog
- pig
pet: [cat,dog,pig]
yaml可以直接给实体类赋值
要想去掉提示在pom添加依赖,并重启idea
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
通过yaml配置对象属性:
Person实体类
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
@ToString
@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;
}
Dog实体类:
@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Component
public class Dog {
@Value("旺财")
private String name;
@Value("3")
private Integer age;
}
application.yaml
person:
name: wyf
age: 10
happy: false
birth: 2011/8/12
maps: {k1: v1,k2: v2}
lists:
- code
- music
- girl
dog:
name: 旺财
age: 3
测试类
@SpringBootTest
class HellospringbootApplicationTests {
@Autowired
private Person person;
@Test
void contextLoads() {
System.out.println(person);
}
}
运行结果:
如果出现中文乱码,yaml文件默认的是GBK,更改配置就行了
yaml与spring配置的区别:
- cp只需要写一次即可,value则需要每个字段都添加
- 松散绑定:比如我们的yml写的last-name,这个和lastName是一样的,后面跟着的字母默认是大写的。这就是松散绑定
- JSR303数据校验,这个就是我们可以在字段是添加一层过滤器验证,可以保证数据的合法性
- 复杂类型封装,yml中可以封装对象,使用@value就不支持
结论:
- 配置yml和配置properties都可以获取到值,强烈推荐yml
- 如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下@value
- 如果说,我们专门编写一个JavaBean来和配置文件进行映射,就直接使用@configurationProperties
能配置什么属性:
在我们yaml配置文件中能配置的东西,都存在一个固有的规律
xxxAutoConfiguration:默认值 xxxProperties 和 配置文件绑定,我们就可以使用自定义的配置了!
配置文件路径:
自动装配的所有属性都在这里
自动装配的原理!精髓:
- SpirngBoot启动会加载大量的自动配置类
- 我们看我们需要的功能有没有在SpringBoot默认写好的自动配置类当中
- 我们再来看这个自动配置类中到底配置了那些组件;(只要我们要用的组件存在在其中,我们就不需要再手动配置了)
- 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们只需要在配置文件中指定这些属性的值即可;
xxxxAutoConfigurartion:自动配置类;给容器中添加组件
xxxxProperties:封装配置文件中相关属性;