说到SpringBoot,大家可能最熟悉的就是:注解开发!自动装配!微服务!可这些大家有没有真正的去从底层了解过呢?今天,小编对自己的Springboot理解进行一个分享,同时也欢迎大家指正!
SpringBoot学习
一、原理解析
1.pom.xml
- spring-boot-dependencies:核心依赖在父工程中
- 我们在写或者引入一些springboot依赖的时候,不需要指定版本,因为有版本仓库
2.启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 启动器:说白了就是springboot的启动场景
- 比如我们启动web,就可以导入 spring-boot-starter-web,就会自动导入web的依赖
- springboot会将所有功能场景,变成一个个的启动器
- 如果我们要使用什么功能,只需要找到对应的启动器就可以
3.主程序:
//@SpringBootApplication:标注这个类是一个springboot的应用
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
4.注解挖掘!!!【重点】
大家从启动类上可以看出SpringBoot不像我们之前开发的那样繁琐,仅仅是一个SpringBoot注解就可以解决,那我们就来聊聊这个注解!
我们先从这里点进去看看:会发现里面核心会有这三个注解,那我们来一 一 看 看
@ComponentScan
这个注解比较好理解,扫描当前启动类同级的包
我们在学习Spring的时候,应该也是接触过的
@SpringBootConfiguration
当我们点开这个注解会发现一个熟悉的面孔:@Configuration
@Configuration 也是在Spring的学习中就遇见过
@Configuration用于定义配置类,类似于之前的xml配置文件,被注解的类内部包含有一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构建bean定义,初始化Spring容器。
当我们再点进去@Configuration,会发现有一个熟悉的面孔:@Component
@Component:组件,放在类上,说明这个类被Spring管理了,就是bean!
等价于:<bean id="user" class="com.wdit.pojo.User"/>
@Component
public class User {
public String name = "乔治";
}
@EnableAutoConfiguration自动装配
我们点进来发现,里面会有这样两个核心注解
1.@AutoConfigurationPackage
我们看一个这个类:代码很多,但是理解一下就是
如果有这个Bean,就get
没有,就new一个
说简单了:就是自动注册的一个表
2.@Import(AutoConfigurationImportSelector.class)
这个注解是自动装配导入包的核心!!!,这个类AutoConfigurationImportSelector,应该是一个包的选择类,我们看看到底选择了什么?
我们研究一下它的几个方法:
方法一:
方法二:
大家看这个方法,先是loadFactoryNames加载一个类的名字,返回一个集合
然后,注意message的信息!!!
实际上这就是核心配置文件的位置
核心配置文件:
springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立,只有导入对应的start,就有对应的启动器了,有了启动器,我们自动装配就会生效,然后就会配置成功!!!
方法三:
这个方法是Spring工厂类的加载
二、Run方法
既然是run方法,我们就先看看它的类SpringApplication
SpringApplication类:
- 推断应用的类是普通的项目还是web项目
- 查找并加载所有可用初始化器,设置到initializers属性中
- 找出所有的应用程序监听器,设置到listeners属性中
- 推断并设置main方法的定义类,找到运行的主类
核心就是用了JavaConfig