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
交易15场5创生涯新高!毕竟是能单换KD的鹈鹕117112击败了老鹰全场CJ26投9中,拿到25分8助4板,命中率虽然不高吧,但整体表现确实相当不错。被交易到鹈鹕之后,CJ总计打了15场比赛,投篮命中率高达50。5,真实命
中国足坛文体恋,那英苦恋高峰无果,李金羽梅开二度中国足坛产生过几对引入瞩目的文体恋,但几乎都是以分手或者离婚收场。让我们来看看有哪些1陶伟吕丽萍陶伟,1966年出生于北京市,80年代效力于北京队,曾入选过国家青年队。1988年,
大手分4个等级乔丹抓南瓜A级,J博士单手大回环S级,那SSS呢?毫不夸张地说,能够被NBA球队看中并选入联盟的球员,无一例外都是身体素质最为顶级的,除了弹跳速度等动态天赋惊人外,他们的静态天赋更是一绝,尤其是手掌,那尺寸简直大到超出了人们的常识
苏炳添,你的奥运奖牌终于来了据国际田联官网信息,国际田联的运动员介绍中,苏炳添谢震业吴智强汤星强的资料上都标注了奥运会铜牌。恭喜中国接力队!在去年举行的东京奥运会田径男子4100米接力比赛中,中国队苏炳添谢震
中国名将02022羽毛球全英公开赛进入到半决赛的较量,女单半决赛,中国台北名将戴资颖对阵韩国天才少女安洗莹,最终,戴资颖连输两局02完败出局,安洗莹则是顺利晋级,锁定了首个女单决赛席位。已经
詹姆斯用19年,砍下36947分,贾巴尔19年拿了多少分?在超越邮差马龙之后,摆在詹姆斯面前的名字,只剩下最后一个了,那就是天勾贾巴尔。翻看NBA历史总得分榜,名列前茅的个个都是超级巨星,一共只有7位30000分先生,从超越张伯伦诺维茨基
14岁宣称要成为传奇人物他,容颜如玉,身姿如松,翩若惊鸿,宛若游龙,一个14岁就宣称要成为传奇人物的花样滑冰选手羽生结弦。日本资深体育新闻记者野口美惠新书羽生结弦王者之路讲述这位不待扬鞭自奋蹄的花样滑冰奥
F1巴林站法拉利1。2带回,周冠宇创造历史拿1分,红牛0分刚刚结束的2022F1巴林站法拉利青春组合勒克莱尔和赛恩斯分获冠亚军,法拉利也是正式宣布重回巅峰。梅赛德斯奔驰的汉密尔顿最后时刻逼的佩雷兹失误夺得第3,本站梅奔显然没有足够的速度争
尘埃落定,196cm国字号新星加盟新疆,能否成为后卫线的答案?送走多位老将,加上莫泰无法回归,新疆男篮前两阶段遭遇了低谷期,从一支冲冠球队,沦为CBA弱旅,好在摩尔特里的到来,加上球队状态触底反弹,新疆男篮目前排在第13名,依然保留了冲击季后
19分惨败!CBA瞩目1战定3队命运,12强出炉,徐长锁要感谢杜锋CBA常规赛进入最后阶段,本轮迎来一场焦点大战,广东男篮正面迎战新疆男篮。虽然新疆男篮已经已非往日,但是近期的出色战绩,已经季后赛的关键时刻,标志着即便是面对劲敌广东,依旧百分百的
带头大哥天下英雄谁敌手,梅罗?踢波当如齐玄宗!普通人一冠难求,而他却拿到手软,联赛冠军杯赛冠军欧冠冠军欧洲冠军世界冠军法甲最佳意甲最佳欧冠最佳法国足球先生欧洲金球奖世界足球先生冠军教练,法