BeanDefinition
BeanDefinition相当于一个设计书图纸,其中存在很多属性用来描述Bean的特点。
beanClass:bean的类型
scope:表示Bean作用域,单例或原型,(默认单例)
lazyInit:表示Bean是否是懒加载
initMethodName:表示Bean初始化要执行的方法名
destroyMethodName:表示Bean销毁时要执行的方法名
可以通过以下方式编程式定义Bean
AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition(); beanDefinition.setBeanClass(User.class);
beanDefinition.setScope("prototype"); // 设置作用域
beanDefinition.setInitMethodName("init"); // 设置初始化方法
beanDefinition.setLazyInit(true); // 设置懒加载
context.registerBeanDefinition("user", beanDefinition);
context.getBean("user");
BeanDefinitionReader
可以将一个类解析成BeanDefinition,并且解析该类的注解
eg:@Scope、@Lazy、@Conditional,@Role、@Primary、@DependsOn、 @Description
BeanFactory(重点)
通俗来讲,就是负责创建Bean的工厂,并且提供获取Bean的API.
我们常见的ApplicationContext其实就是一个BeanFactory,ApplicationContext继承了ListableBeanFactory 和HierarchicalBeanFactory,而ListableBeanFactory和HierarchicalBeanFactory都继承至 BeanFactory,所以可以认为ApplicationContext继承了BeanFactory。ApplicationContext比BeanFactory更加强大,因为它继承了很多其他的接口,
例如:MessageSource(国际化),ApplicationEventPublisher(时间发布)等。
BeanFactory有一个非常重要的实现类:DefaultListableBeanFactory实现了很多很多强大的功能。
1. AliasRegistry:支持别名功能,一个名字可以对应多个别名
2. BeanDefinitionRegistry:可以注册、保存、移除、获取某个BeanDefinition
3. BeanFactory:Bean工厂,可以根据某个bean的名字、或类型、或别名获取某个Bean对象
4. SingletonBeanRegistry:可以直接注册、获取某个单例Bean
5. SimpleAliasRegistry:它是一个类,实现了AliasRegistry接口中所定义的功能,支持别名功能
6. ListableBeanFactory:在BeanFactory的基础上,增加了其他功能,可以获取所有BeanDefinition的beanNames,可以根据某个类型获取对应的beanNames,可以根据某个类 型获取{类型:对应的Bean}的映射关系
7. HierarchicalBeanFactory:在BeanFactory的基础上,添加了获取父BeanFactory的功能
8. DefaultSingletonBeanRegistry:它是一个类,实现了SingletonBeanRegistry接口,拥有了直 接注册、获取某个单例Bean的功能
9. ConfigurableBeanFactory:在HierarchicalBeanFactory和SingletonBeanRegistry的基础上, 添加了设置父BeanFactory、类加载器(表示可以指定某个类加载器进行类的加载)、设置 SpringEL表达式解析器(表示该BeanFactory可以解析EL表达式)、设置类型转化服务(表示 该BeanFactory可以进行类型转化)、可以添加BeanPostProcessor(表示该BeanFactory支持 Bean的后置处理器),可以合并BeanDefinition,可以销毁某个Bean等等功能
10. FactoryBeanRegistrySupport:支持了FactoryBean的功能
11. AutowireCapableBeanFactory:是直接继承了BeanFactory,在BeanFactory的基础上,支持 在创建Bean的过程中能对Bean进行自动装配
12. AbstractBeanFactory:实现了ConfigurableBeanFactory接口,继承了FactoryBeanRegistrySupport,这个BeanFactory的功能已经很全面了,但是不能自动装配和 获取beanNames
13. ConfigurableListableBeanFactory:继承了ListableBeanFactory、 AutowireCapableBeanFactory、ConfigurableBeanFactory
14. AbstractAutowireCapableBeanFactory:继承了AbstractBeanFactory,实现了 AutowireCapableBeanFactory,拥有了自动装配的功能。
15. DefaultListableBeanFactory:继承了AbstractAutowireCapableBeanFactory,实现了 ConfigurableListableBeanFactory接口和BeanDefinitionRegistry接口,所以 DefaultListableBeanFactory的功能很强大。