Springboot自动装配原理
自动装配:
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会将所有的功能场景,都变成一个个的启动器
我们要使用什么功能,就只要找到对应的启动器就可以了 starter
主程序
注解
@SpringBootConfiguration springboot的配置
@Configuration spring配置类
@Component 说明这也是一个spring的组件
@EnableAutoConfiguration 自动配置 @AutoConfigurationPackage 自动配置包
@Import(AutoConfigurationPackages.Registrar.class) 导入选择器 自动配置包注册
@Import(AutoConfigurationPackages.Registrar.class) 自动配置导入选择
大家还可以翻看更多底层的原码,我是不看了,我懵逼了,但是理解底层原码还是重要的。
结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定会生效,要判断条件是否成立,只要导入了对应的start,就有对应的启动器了,有了启动器,我们启动装配就会生效,然后配置成功。
结论:
1.SpringBoot在启动的时候是从类路径下的META-INF/spring-factories中获取EnableAutoConfiguration指定的值
2.将这些值作为自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作。
3.以前我们需要自己配置的东西,自动配置类都帮我们解决了
4.整个J2EE的整体解决方案和自动配置都在springboot-autoconfigure的jar包中
5.它将所有需要导入的组件以全类名 的方式返回,这些组件就会被添加到容器中
6.它会给容器中导入非常多的自动配置类,{xxxAutoConfiguration},就是容器中导入这个场景需要的所有组件,并配置好这些组件。
7.有了自动配置类,免去了我们手动写配置注入功能组件等工作。
yaml语法
新建一个项目。
一般不喜欢application以properties为后缀,喜欢用yaml为后缀,我们可以把它删了重新创建一个
yaml和properties的书写格式是不同的,如果我们想在yaml中修改tomcat端口号:
注意和这个空格一定不能删除。
如果我们想定义个值,在之前的properties中key=value
这里我们要key: value
我们的yaml还可以存放对象:
我们可以对比一下存放对象是yaml和properties的区别:
yaml:
properties:
存放对象在yaml文件中还可以使用行内写法和js差不多:
yaml中还可以存放数组:
properties只能存放键值对。
给属性赋予的几种方式
创建一个实体类:
创建有参无参构造方法,get,set方法,toString方法。
再建立一个类:
同样建立有参,无参构造方法,get,set方法,toString方法。
我们之前spring是怎么给属性赋值的呢?
运行一下:
我们以前这种原生的赋值方式可以通过这种注解也可以通过new一个对象,我们现在来了解一下新的赋值方式:利用yaml来赋值:
我们可以用这种方式进行赋值。
测试一下:
我们接下来来解决一下爆红的问题:
现在就不报红了。
我们也可以用properties文件
我们的yaml文件还有一些其它的功能:
我们可以给属性赋值随机数,也可以都对属性值进行一个判断。
我们之前的yaml中的maps属性没有和值之间加一个空格,返回值为空。
我们把空格加上
测试:
如果我们加上hello属性:
再测试一下:
对比来看的话,用yaml文件比我们直接用spring注解好多了。
JSR303校验
我们先来了解一下什么是松散绑定:
我们可以发现我们yaml中名称属性是用-连接,而实体类中是驼峰命名法。属性名称是不一样的,我们运行一下:
我们发现虽然名称并不完全相同,但是结果也对应上了。这就是yaml文件的一个特性,spring中的@Value()是做不到这点的。
JSR303校验
我们可以使用一个举个例子:
我们指定我们的name属性必须是Email格式,我们还需要配置一下pom.xml不然有时候可能会爆红:
我们的yaml中不是email格式。
我们去测试一下:
我们发现它可以给我们错误信息提示。
我们也可以自定义提示的内容:
再测试一次: