Aware生命周期感知接口#Aware接口里啥也没有,有方法的是它的子接口
public interface Aware { }
Aware被一个想要感知到框架中的某种信息的Bean实现,比如一个Bean可能对创建它的Bean工厂感兴趣,那么它可以实现这个接口:
public interface BeanFactoryAware extends Aware { void setBeanFactory(BeanFactory beanFactory) throws BeansException;}
Bean工厂会在该Bean的初始化阶段检测该Bean是否实现了这个接口,如果实现了就调用它的setBeanFactory
方法将工厂设置进去 。
请注意,Aware被Bean实现,作用于单个Bean,BeanPostProcessor被注册到Bean工厂中,作用于工厂中的每个Bean 。实例化Bean&属性设置#这图里所描述的是,创建Bean时先从BeanDefinition开始,然后实例化Bean,在实例化前后,
InstantiationAwareBeanPostProcessor
会被调用 。
文章插图
下面从
doGetBean
方法开始(getBean
方法实际调用的方法,它已经是AbstractBeanFactory
中的方法了),看下面的代码需要注意,Spring中Bean的作用域可以分为Singleton、Prototype和其它,其中Singleton和Prototype是Spring框架原生支持的,其它作用域需要自行扩展,比如SpringWebMVC扩展了Session等作用域 。所以你看下面的代码时也要在脑袋里把它们分成Singleton、Prototype和其它作用域,要不然你可能就被这很长很长的代码搞迷糊了:protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)throws BeansException {String beanName = transformedBeanName(name);Object beanInstance;// ...try {// 根据BeanName获取BeanDefinition// MergedBeanDefinition是将它和它的祖先Bean整合,这里可以先忽略,就当作普通的BeanDefinitionRootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);checkMergedBeanDefinition(mbd, beanName, args);// 如果是Singleton,按Singleton的方法创建if (mbd.isSingleton()) {sharedInstance = getSingleton(beanName, () -> {try {// [+] 实际创建Beanreturn createBean(beanName, mbd, args);}catch (BeansException ex) {}});beanInstance = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);}// 如果是Prototype,按Prototype的方法创建else if (mbd.isPrototype()) {Object prototypeInstance = null;try {beforePrototypeCreation(beanName);// [+] 实际创建BeanprototypeInstance = createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}beanInstance = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);}// 如果是其它作用域,那么就放到其它作用域中创建// 这里的逻辑和Singleton很像,在Singleton创建中// Bean放到SingletonBeanRegistry中管理,而这个// 放到对应的作用域中管理else {String scopeName = mbd.getScope();Scope scope = this.scopes.get(scopeName);try {Object scopedInstance = scope.get(beanName, () -> {beforePrototypeCreation(beanName);try {// [+] 实际创建Beanreturn createBean(beanName, mbd, args);}finally {afterPrototypeCreation(beanName);}});beanInstance = getObjectForBeanInstance(scopedInstance, name, beanName, mbd);}catch (IllegalStateException ex) {}}}catch (BeansException ex) {}}return adaptBeanInstance(name, beanInstance, requiredType);}
所以,不管是哪个作用域,它们都调用了createBean
来创建Bean,AbstractBeanFactory
中并没有实现这个方法,createBean
是AbstractAutowireCapableBeanFactory
抽象类实现的:@Overrideprotected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)throws BeanCreationException {RootBeanDefinition mbdToUse = mbd;try {// 在Bean实例化之前,让一些关心实例化阶段的BeanPostProcessor得到执行Object bean = resolveBeforeInstantiation(beanName, mbdToUse);// 如果返回的bean不是null,那么结束整个阶段,直接返回这个值作为beanif (bean != null) {return bean;}}catch (Throwable ex) {}try {// 实例化BeanObject beanInstance = doCreateBean(beanName, mbdToUse, args);return beanInstance;}catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {}catch (Throwable ex) {}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 2023年农历八月初一砍树吉日 2023年9月15日砍树好吗
- 2023年9月15日买宠物好不好 2023年9月15日买宠物好吗
- 2023年9月15日是买狗的黄道吉日吗 2023年9月15日买狗黄道吉日
- 2023年9月15日买猫行吗 2023年9月15日是买猫吉日吗
- 2023年1月28日买牛好吗 2023年1月28日是买牛吉日吗
- 2023年农历八月初一买鸡吉日 2023年9月15日买鸡好不好
- 2023年9月15日是买鸭吉日吗 2023年农历八月初一买鸭吉日
- 2023年农历正月初七买猫吉日 2023年1月28日适合买猫吗
- 2023年农历正月初七宜砍树吗 2023年1月28日砍树吉日一览表
- 2023年1月28日适合塑绘吗 2023年1月28日塑绘黄道吉日