Spring源码SpringBean的创建过程(14)
到目前为止,我们知道Spring创建Bean对象有5中方法,分别是: 使用FactoryBean的getObject方法创建 使用BeanPostProcessor的子接口InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法创建 设置BeanDefinition的Supplier属性进行创建 设置BeanDefinition的factory-method进行创建 使用全过程:getBean-->doGetBean-->createBean-->doCreateBean 反射进行创建
前面4种已经介绍,接下来介绍第5种,我们知道如果使用反射创建,那么必然要知道使用构造函数进行实例化,因为使用构造函数能够将带有参数的设置进去。 SmartInstantiationAwareBeanPostProcessor 接口
在前面讲过InstantiationAwareBeanPostProcessor 是用来提前实例化对象的,而SmartInstantiationAwareBeanPostProcessor是InstantiationAwareBeanPostProcessor 的接口,他是用来干啥呢?
在createBeanInstance方法中的源码: // 省略代码.... // 明确构造器从BeanPostProcessor中,对应的是 AutowiredAnnotationBeanPostProcessor // 他是 SmartInstantiationAwareBeanPostProcessor 的子类,使用determineCandidateConstructors进行 // 解析构造函数 Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName); if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR || mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) { return autowireConstructor(beanName, mbd, ctors, args); } // 省略代码....
点进去: protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName) throws BeansException { if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) { for (BeanPostProcessor bp : getBeanPostProcessors()) { if (bp instanceof SmartInstantiationAwareBeanPostProcessor) { SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp; // 决定候选的构造函数 Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName); if (ctors != null) { return ctors; } } } } return null; }
可以看到这个接口是用来解析BeanClass的构造函数的,SmartInstantiationAwareBeanPostProcessor的实现类AutowiredAnnotationBeanPostProcessor,这个类是用来解析确定合适的构造函数,重点解析了@Autowired注解,并且还解析了@Value注解和@Lookup注解。
当解析出来构造函数之后,那么就调用autowireConstructor方法进行实例化,解析时会new一个构造器解析器ConstructorResolver ,在解析factoryMehod时也是使用的这个类使用的是instantiateUsingFactoryMethod这个方法,并且解析factoryMethod更加复杂,需要判断是否是静态的工厂创建还是实例工厂创建,而自动装配的构造解析相对来说简单一些,使用autowireConstructor方法进行解析。
最终解析出构造方法和构造参数之后进行实例化: // 使用合适的构造方法和构造参数进行实例化 bw.setBeanInstance(instantiate(beanName, mbd, constructorToUse, argsToUse));
实例化: private Object instantiate( String beanName, RootBeanDefinition mbd, Constructor<?> constructorToUse, Object[] argsToUse) { try { // 获取实例化策略,一般使用 CglibSubClassingInstantiationStrategy InstantiationStrategy strategy = this.beanFactory.getInstantiationStrategy(); if (System.getSecurityManager() != null) { return AccessController.doPrivileged((PrivilegedAction
房地产推广有哪些渠道?1软文推广软文推广,即是把房地产的相关内容负责撰写的,让用户通过软文可以清晰得了解到关于房地产的相关信息,加深他们对此房地产的理解,从而吸引用户消费。2视频营销推广短视频推广是目前
你们都在回避一个问题,滴滴合法吗?我在一家规模较小的网约车公司做过运营人员,我来告诉你类似滴滴的网约车公司到底合不合法。首先,注册一家网约车公司在最近几年并不难拿到合法手续。第一步是你需要开发一套类似滴滴打车那样的
什么是SEO优化?通过了解各类搜索引擎抓取互联网页面进行索引以及确定其对特定关键词搜索结果排名等技术,来对网页进行相关的优化,使其提高搜索引擎排名,从而提高网站访问量,最终提升网站的销售或宣传的效果
ERP真的快要消失了吗?ERP不会消失,一定会升级用鱼骨图来描述下ERP,一个主箭头,开头是数据,结尾是利润。各部门都是主线上的点,这些点是公司各部门的职能,但有一点很重要协作!现在许多公司ERP失败主要
小米10,想买个蓝牙耳机,最好是半入耳,有什么推荐?小米的手机就可以考虑小米耳机,毕竟适配会好点,或者京东上搜一下。如果对音质要求不高的话,我推荐QCY可以考虑一下,我个人买的是T1,平常上下班听歌听书感觉足够。这个品牌好像也是小米
零售的本质重新解构人货场新零售这个概念最早被大家熟知,是2016年的阿里巴巴云栖大会上,马云提到未来的10年20年没有电子商务这一说,只有新零售,也就是说,线上线下和物流必须结合在一起,才能诞生真正的新零
iPhone降价越来越凶,国产安卓却越卖越贵,这到底为何?今年iPhone13销量惊人,其中最主要的一个原因就是降价了,加量不加价能不香吗?反观国产安卓手机,这两年的售价是不断创新高,很多机型都已经比同年的iPhone贵了。这到底是为何?
唠叨一下腾讯为什么让人反感腾讯作为一家由IM软件发展起来的巨头,可以说比较低调。与同为巨头的阿里相比,创始人几乎没什么发声,团队也相对更务实一些。按理说这种类型的公司应该更受欢迎,事实恰好相反,随便翻一篇关
人类失去联想,世界将会怎样联想的专利是诺基亚买完摩托罗拉剩下的没用的专利,要这些个专利有啥用,能当5G专利收钱吗?能给国家撑腰吗?联想有毛超巨型机呀哪款,天河吗?好意思说出来,世界前十?世界不少国家气象部门
三个喜讯传来!拒绝华为的台积电计划泡汤,中芯国际即将崛起台积电作为我国的企业却想跟着老美混,在失去利润的时候,又想回来赚中国人的钱,简直是可笑至极!国人各个都是小机灵鬼儿,又怎能允许你瞎搞呢?台积电在今年四月份的时候,董事会一致决定要花
苹果安卓之争1苹果的优点系统流畅广告少广告少广告少重要的事情说三遍!!!相机白天拍照不错基本上能全部还原眼睛看到的色彩。晚上不行晚上不行晚上不行鬼影鬼影鬼影2苹果缺点续航不行快充不行信号不怎么