提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
在我们学习完java SE的时候如何开发web级的应用,那肯定离不开spring家族框架的支持。spring最重要的特征就是IOC容器,AOP等,极大简化了我们的开发流程。而springboot可以理解为spring,springMVC的注解版。
spring作为非侵入框架,源码是及其优秀的,在阅读源码的基础上,可以学到很多知识。
一、springboot在创建bean的时候都有哪些核心组件?
核心组件如下:
为什么是这些组件?组件又是怎么找到的呢?
首先需要我们安装springboot的源码
大家可以在github上下载源码,当然也可以在gitee上下载:https://gitee.com/llbnk/spring-framework
当我们创建对象的时候,在spring中我们采用xml形式,在springboot中我们采用注解方式。
1.1、Resource
我们配置xml和注解都能被spring变成容器中的对象。那就离不开spring的资源类,资源跟接口就是Resource。
可以看到资源可以是通过网络访问的(http),也可以是类路径加载的(classPath)。
而是什么加载的这些资源类呢?那就是资源加载类
1.1、ResourceLoader
ResourceLoader是加载资源类的跟父类。
1.1、BeanFactory
后端代码
//xml形式
<bean class="com.llbnk.bean.Person" id="person">
<property name="name" value="llbnk"></property>
</bean>
<bean class="com.llbnk.bean.Cat" id="cat">
<property name="name" value="它的猫"></property>
</bean>
//注解形式
@Component
public class Cat {
String name;
int id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
而我们在创建一个bean的时候需要去使用ClassPathXmlApplicationContext或者是AnnotationConfigApplicationContext。
public class springTest
{
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
Person person = context.getBean(Person.class);
System.out.println(person.toString());
}
}
public class AnnotationTest {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MainConfig.class);
Cat bean = context.getBean(Cat.class);
}
}
而在这个ClassPathXmlApplicationContext就是我们分析的重点。
通过查询继承关系我们可以知道ClassPathXmlApplicationContext是继承了AbtractApplicationContext,而AbtractApplicationContext实现了BeanFactory。同时也是实现了ResourceLoader。
而通过beanfactory这个顶级根接口,可以得出下面有三个接口AutowireCapableBeanFactory、AutowireCapableBeanFactory、ListableBeanFactory。
1.2、ListableBeanFactory
当前我们知道我们配置的resource,使用过resourceloader加载,并给了Beanfactory。
那么是如何将resourceloader加载的resource送入bean工厂的?用的是什么形式?
BeanFactory内部使用什么存储的这些beanFactory。
我们观察ListableBeanFactory。
DefaultListableBeanFactory实现了ListableBeanFactory,BeanDefinitionRegistry.而在DefaultListableBeanFactory中存在一个Map,这个map就是存放所有bean的地方。
而这些bean都以beanDefinition的形式存储在BeanDefinitonRegistry中。
而真正存储beanDefinition是beanDefinitionMap中。beanDefinition就是bean的源信息,并不是真正java生成的对象。它更像是将你配置的xml,注解等信息解析成一个beanDefinition对象。
singletonObjects这个IOC容器,这个就是存储所有single bean的地方。
1.2、BeanDefinitionReader
BeanDefinitionReader就是能将我们通过resourceLoader加载的信息,转换为BeanDefinition接口,我们看到他并没有很多的实现类。说明转为BeanDefinition的工作是由其他类组合完成的。
BeanDefinitionDocumentReader将拿到的BeanDefinitionReader转换的BeanDefinition,并对其进行进一步的解析。例如,它可以处理在XML文件中定义的属性,比如bean的依赖关系,bean的作用域等等。
总结
spring框架还是很复杂的,不过学习下来收益很多。