没有合适的资源?快使用搜索试试~ 我知道了~
课程目标 1. 搞清楚BeanFactory家族的接口和类的作用 2. 搞清楚ApplicationContext家族的接口和类的作用 3. 搞清楚BeanDefinitionRegistry和SingletonBeanRegistry的作用 4. 搞清楚注册BeanDefinition流程中各个类的作用 5. 搞清楚创建Bean实例流程中各个类的作用 6. 通过以上接口和类的理解,我们写出IoC模块的V3版本 7. 可以自主完成阅读Spring框架中BeanDefinition注册流程的源码 8. 可以自主完成阅读Spring框架中Bean实例创建流程的源码 9. 可以自主完成阅读Spring框架中依赖注入流程的源码 10. 可以确定aop流程的源码阅读入口
资源推荐
资源详情
资源评论
课
程
主
题
手写Spring IoC模块V3版本&IoC模块源码阅读
课
程目
标
1. 搞清楚BeanFactory家族的接口和类的作用
2. 搞清楚ApplicationContext家族的接口和类的作用
3. 搞清楚BeanDefinitionRegistry和SingletonBeanRegistry的作用
4. 搞清楚注册BeanDefinition流程中各个类的作用
5. 搞清楚创建Bean实例流程中各个类的作用
6. 通过以上接口和类的理解,我们写出IoC模块的V3版本
7. 可以自主完成阅读Spring框架中BeanDefinition注册流程的源码
8. 可以自主完成阅读Spring框架中Bean实例创建流程的源码
9. 可以自主完成阅读Spring框架中依赖注入流程的源码
10. 可以确定aop流程的源码阅读入口
课
程
回
顾
画图说明BeanDefinition的注册和Bean实例创建流程
课
程
内
容
一
、
Spring
重
要
接
口
详解
1.1 BeanFactory
继
承
体
系
1.1.1
体
系结
构
图
这是BeanFactory基本的类体系结构,这里没有包括强大的ApplicationContext体系,
ApplicationContext单独搞一个。
四
级
接
口
继
承
体
系
:
1. BeanFactory 作为一个主接口不继承任何接口,暂且称为
一
级
接
口
。
2. AutowireCapableBeanFactory、HierarchicalBeanFactory、ListableBeanFactory 3个子接
口继承了它,进行功能上的增强。这3个子接口称为
二
级
接
口
。
3. ConfigurableBeanFactory 可以被称为
三
级
接
口
,对二级接口 HierarchicalBeanFactory 进行
了再次增强,它还继承了另一个外来的接口 SingletonBeanRegistry
4. ConfigurableListableBeanFactory 是一个更强大的接口,继承了上述的所有接口,无所不
包,称为
四
级
接
口
。
总
结
:
|-- BeanFactory 是Spring bean容器的
根
接
口
.
提供获取bean,是否包含bean,是否单例与原型,获取bean类型,bean 别名的api.
|-- -- AutowireCapableBeanFactory 提供工厂的装配功能。
|-- -- HierarchicalBeanFactory 提供父容器的访问功能
|-- -- -- ConfigurableBeanFactory 如名,提供factory的配置功能,眼花缭乱好多api
|-- -- -- -- ConfigurableListableBeanFactory 集大成者,提供解析,修改bean定义,并
初始化单例.
|-- -- ListableBeanFactory 提供容器内bean实例的枚举功能.这边不会考虑父容器内的实
例.
看到这边,我们是不是想起了设计模式原则里的
接
口
隔
离
原
则
。
下
面
是
继
承
关
系的
2
个
抽
象
类
和
2
个
实
现
类
:
1. AbstractBeanFactory 作为一个抽象类,实现了三级接口 ConfigurableBeanFactory 大部分功
能。
2. AbstractAutowireCapableBeanFactory 同样是抽象类,继承自 AbstractBeanFactory ,并额
外实现了二级接口 AutowireCapableBeanFactory 。
3. DefaultListableBeanFactory 继承自 AbstractAutowireCapableBeanFactory ,实现了最强
大的四级接口 ConfigurableListableBeanFactory ,并实现了一个外来接口
BeanDefinitionRegistry ,它并非抽象类。
4. 最后是最强大的 XmlBeanFactory ,继承自 DefaultListableBeanFactory ,重写了一些功能,
使自己更强大。
总
结
:
BeanFactory 的类体系结构看似繁杂混乱,实际上由上而下井井有条,非常容易理解。
1.1.2 BeanFactory
package org.springframework.beans.factory;
public interface BeanFactory {
//用来引用一个实例,或把它和工厂产生的Bean区分开
//就是说,如果一个FactoryBean的名字为a,那么,&a会得到那个Factory
String FACTORY_BEAN_PREFIX = "&";
/*
1
2
3
4
5
6
7
8
9
源
码
说
明
:
4个获取实例的方法。getBean的重载方法。
4个判断的方法。判断是否存在,是否为单例、原型,名称类型是否匹配。
1个获取类型的方法、一个获取别名的方法。根据名称获取类型、根据名称获取别名。一目了
然!
总
结
:
这10个方法,很明显,这是一个典型的工厂模式的工厂接口。
1.1.3 ListableBeanFactory
可
将
Bean
逐
一
列出
的
工
厂
* 四个不同形式的getBean方法,获取实例
*/
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws
BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
// 是否存在
boolean containsBean(String name);
// 是否为单实例
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
// 是否为原型(多实例)
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
// 名称、类型是否匹配
boolean isTypeMatch(String name, Class<?> targetType)
throws NoSuchBeanDefinitionException;
// 获取类型
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
// 根据实例的名字获取实例的别名
String[] getAliases(String name);
}
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public interface ListableBeanFactory extends BeanFactory {
// 对于给定的名字是否含有
boolean containsBeanDefinition(String beanName); BeanDefinition
// 返回工厂的BeanDefinition总数
int getBeanDefinitionCount();
// 返回工厂中所有Bean的名字
String[] getBeanDefinitionNames();
// 返回对于指定类型Bean(包括子类)的所有名字
String[] getBeanNamesForType(Class<?> type);
/*
* 返回指定类型的名字
* includeNonSingletons为false表示只取单例Bean,true则不是
* allowEagerInit为true表示立刻加载,false表示延迟加载。
* 注意:FactoryBeans都是立刻加载的。
*/
String[] getBeanNamesForType(Class<?> type, boolean
includeNonSingletons,
boolean allowEagerInit);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
源
码
说
明
:
3个跟BeanDefinition有关的总体操作。包括BeanDefinition的总数、名字的集合、指定
类型的名字的集合。
这里指出,BeanDefinition是Spring中非常重要的一个类,每个BeanDefinition实
例都包含一个类在Spring工厂中所有属性。
2个getBeanNamesForType重载方法。根据指定类型(包括子类)获取其对应的所有Bean名
字。
2个getBeansOfType重载方法。根据类型(包括子类)返回指定Bean名和Bean的Map。
2个跟注解查找有关的方法。根据注解类型,查找Bean名和Bean的Map。以及根据指定Bean
名和注解类型查找指定的Bean。
总
结
:
正如这个工厂接口的名字所示,这个工厂接口最大的特点就是可以列出工厂可以生产的所有实例。
当然,工厂并没有直接提供返回所有实例的方法,也没这个必要。它可以返回指定类型的所有的实例。
而且你可以通过getBeanDefinitionNames()得到工厂所有bean的名字,然后根据这些名字得到所有
的Bean。这个工厂接口扩展了BeanFactory的功能,作为上文指出的BeanFactory二级接口,有9个独
有的方法,扩展了跟BeanDefinition的功能,提供了BeanDefinition、BeanName、注解有关的各种
操作。
它
可
以
根
据条
件
返
回
Bean
的
集
合
,
这
就
是
它
名
字
的由
来
——
ListableBeanFactory
。
1.1.4 HierarchicalBeanFactory
分
层
的
Bean
工
厂
参
数
说
明
:
第一个方法返回本Bean工厂的父工厂。这个方法实现了工厂的分层。
第二个方法判断本地工厂是否包含这个Bean(忽略其他所有父工厂)。这也是分层思想的体
现。
// 根据类型(包括子类)返回指定Bean名和Bean的Map
<T> Map<String, T> getBeansOfType(Class<T> type) throws BeansException;
<T> Map<String, T> getBeansOfType(Class<T> type,
boolean includeNonSingletons, boolean allowEagerInit)
throws BeansException;
// 根据注解类型,查找所有有这个注解的Bean名和Bean的Map
Map<String, Object> getBeansWithAnnotation(
Class<? extends Annotation> annotationType) throws
BeansException;
// 根据指定Bean名和注解类型查找指定的Bean
<A extends Annotation> A findAnnotationOnBean(String beanName,
Class<A> annotationType);
}
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public interface HierarchicalBeanFactory extends BeanFactory {
// 返回本Bean工厂的父工厂
BeanFactory getParentBeanFactory();
// 本地工厂是否包含这个Bean
boolean containsLocalBean(String name);
}
1
2
3
4
5
6
剩余20页未读,继续阅读
资源评论
Java码库
- 粉丝: 1264
- 资源: 3919
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功