Spring IOC BeanFactory
BeanFactory
提供Bean基础能力
ListableBeanFactory
可迭代BeanFactory。对BeanFactory
的增强,定义了一系列根据beanType获取bean或者beanName的方法
- 不仅仅是针对Bean,也可以对BeanDefinition迭代
AutowireCapableBeanFactory
能进行自动装配的BeanFactory
,定义了自动装配的类型(byName/byType),createBean
, autowireBean
, 自动装配属性, populateBean, initializeBean, 对于与bean生命周期相关的方法都将在这里体现
功能
非Spring Bean中使用Bean时,可以使用AutowireCapableBeanFactory,将当前类注册为Spring Bean
场景
Filter使用Spring Bean
将Filter使用AutowireCapableBeanFactory注册为Spring Bean
非Spring中使用Spring容器
ApplicationContextHolder#autowire
实现Aware接口,重写setApplicationContext()方法,在实现中将ApplicationContext设置入Holder
HierarchialBeanFactory
等级
SingletonBeanRegistry
面试题
使用位置
Bean不设置懒加载场景下,在AbstractApplicationContext#refresh 结束后,会初始化Bean,此时调用SingletonBeanRegistry
ConfigurableBeanFactory
可配置的BeanFactory
,定义了各种各样的配置能力,如bean的作用域,bean的classLoader,添加bean的后置处理器,设置bean的创建状态,销毁bean等等
ConfigurableListableBeanFactory
配置与迭代能力。对ConfigurableBeanFactory
的增强,定义了忽略bean的类型、缓存bean定义、预实例化单例bean等方法
BeanDefinitionRegistry
bean定义注册器,定义了与bean定义相关的方法
DefaultListableBeanFactory
在以上父类的功能基础上实现了ConfigurableBeanFactory
和BeanDefinitionRegistry
接口,定义了一些存放Bean定义相关信息的Map
- 实现BeanDefinitionRegistry
- 为Application Context.getBean()提供能力
Bean
的元信息从何而来?
BeanDefinition
其实是一个接口,并不是一个具体的类,我们也可以看一下它的UML图
可以发现这里使用了模板方法的设计模式扩展了许多的子类,其中我们最常用的为RootBeanDefinition
,它主要包含的属性如下:
我们向容器中注册的Bean定义的信息大概就是如此,当BeanFactory
生产Bean
时,便可以通过beanClass
清楚的知道Bean
的类是什么,作用域是怎样,是否懒加载,init方法是什么等等等等
从Demo看起
1 2 3 4 5 6 7 8 9 10 11
| public static void main(String[] args) { DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); RootBeanDefinition beanDefinition = new RootBeanDefinition(Wheel.class); beanFactory.registerBeanDefinition("wheel",beanDefinition); }
public static class Wheel { }
|
创建BeanDefinition
1 2 3 4 5 6
| public RootBeanDefinition(@Nullable Class<?> beanClass) { super(); setBeanClass(beanClass); }
|
初始化父类
1 2 3 4 5 6 7 8 9 10 11
| autowireCandidate = true; primary = false;
protected AbstractBeanDefinition() { this(null, null); } protected AbstractBeanDefinition(@Nullable ConstructorArgumentValues cargs, @Nullable MutablePropertyValues pvs) { this.constructorArgumentValues = cargs; this.propertyValues = pvs; }
|
将BeanDefinition注册到容器中
1 2 3
| this.beanDefinitionMap.put(beanName, beanDefinition); this.beanDefinitionNames.add(beanName);
|
看到这里,大家伙可能会充满疑问?what? 就这样?没有填充属性的步骤吗?嘿嘿,BeanFactory
是一个纯粹的工厂,只负责生产Bean
,是没有装配(设计)BeanDefinition
的功能的,专业的事还是交给专业的人做,设计的事情还是交由ApplicationContext
完成的。
那在ApplicationContext
中是怎么完成一个BeanDefinition
的呢?还记得预启动将配置类注册到容器中时有这样一段代码吗?以下代码为AnnotatedBeanDefinitionReader#doRegisterBean
中的摘要部分:
1 2 3 4 5 6 7 8
| <T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name, @Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) { AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
}
|
而非配置的Bean
是通过在预启动时注册的配置类后置处理器ConfigurationClassPostProcessor#processConfigBeanDefinitions
中完成的,以下代码为ClassPathBeanDefinitionScanner#doScan
中的摘要部分,详细调用链将在后面的文章进行说明
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| protected Set<BeanDefinitionHolder> doScan(String... basePackages) { Set<BeanDefinitionHolder> beanDefinitions = new LinkedHashSet<>(); for (String basePackage : basePackages) { Set<BeanDefinition> candidates = findCandidateComponents(basePackage); for (BeanDefinition candidate : candidates) { if (candidate instanceof AbstractBeanDefinition) { postProcessBeanDefinition((AbstractBeanDefinition) candidate, beanName); } if (candidate instanceof AnnotatedBeanDefinition) { AnnotationConfigUtils.processCommonDefinitionAnnotations((AnnotatedBeanDefinition) candidate); } registerBeanDefinition(definitionHolder, this.registry); } }
|
处理BeanDefinition
1 2 3 4 5 6 7 8
| protected void postProcessBeanDefinition(AbstractBeanDefinition beanDefinition, String beanName) { beanDefinition.applyDefaults(this.beanDefinitionDefaults); if (this.autowireCandidatePatterns != null) { beanDefinition.setAutowireCandidate(PatternMatchUtils.simpleMatch(this.autowireCandidatePatterns, beanName)); } }
|
设置默认值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public void applyDefaults(BeanDefinitionDefaults defaults) { Boolean lazyInit = defaults.getLazyInit(); if (lazyInit != null) { setLazyInit(lazyInit); } setAutowireMode(defaults.getAutowireMode()); setDependencyCheck(defaults.getDependencyCheck()); setInitMethodName(defaults.getInitMethodName()); setEnforceInitMethod(false); setDestroyMethodName(defaults.getDestroyMethodName()); setEnforceDestroyMethod(false); }
|
处理普通的bean定义注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| public static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd) { processCommonDefinitionAnnotations(abd, abd.getMetadata()); }
static void processCommonDefinitionAnnotations(AnnotatedBeanDefinition abd, AnnotatedTypeMetadata metadata) { AnnotationAttributes lazy = attributesFor(metadata, Lazy.class); if (lazy != null) { abd.setLazyInit(lazy.getBoolean("value")); } else if (abd.getMetadata() != metadata) { lazy = attributesFor(abd.getMetadata(), Lazy.class); if (lazy != null) { abd.setLazyInit(lazy.getBoolean("value")); } } if (metadata.isAnnotated(Primary.class.getName())) { abd.setPrimary(true); } AnnotationAttributes dependsOn = attributesFor(metadata, DependsOn.class); if (dependsOn != null) { abd.setDependsOn(dependsOn.getStringArray("value")); } AnnotationAttributes role = attributesFor(metadata, Role.class); if (role != null) { abd.setRole(role.getNumber("value").intValue()); } AnnotationAttributes description = attributesFor(metadata, Description.class); if (description != null) { abd.setDescription(description.getString("value")); } }
|
attributesFor(metadata, Lazy.class)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| static AnnotationAttributes attributesFor(AnnotatedTypeMetadata metadata, Class<?> annotationClass) { return attributesFor(metadata, annotationClass.getName()); } static AnnotationAttributes attributesFor(AnnotatedTypeMetadata metadata, String annotationClassName) { return AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(annotationClassName, false)); } default Map<String, Object> getAnnotationAttributes(String annotationName, boolean classValuesAsString) { MergedAnnotation<Annotation> annotation = getAnnotations().get(annotationName, null, MergedAnnotationSelectors.firstDirectlyDeclared()); if (!annotation.isPresent()) { return null; } return annotation.asAnnotationAttributes(Adapt.values(classValuesAsString, true)); }
|
以上为扫描@Component注解类进行解析元数据填充属性的逻辑,在配置类中以@Bean方式注册的BeanDefinition填充属性过程在ConfigurationClassBeanDefinitionReader.loadBeanDefinitions(configClasses)
BeanFactory
生产Bean
的过程是怎样的?
现在,我们已经知道了一个BeanDefinition
的具体结构以及是如何产生并注册到BeanFactory
的,那么BeanFactory
又是如何使用它生产Bean
的呢?以下附上createBean
的粗略流程图,具体细节将放在IOC容器启动流程中详细说明
来源
https://www.bilibili.com/video/BV1XZ4y1R7hj
https://zhuanlan.zhihu.com/p/264434667