Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選
一、舉個(gè)栗子
public class BeanServiceImpl implements BeanService {
}
@Configuration
public class ConfigurationBean {
@Bean
public BeanService beanService() {
BeanServiceImpl beanService = new BeanServiceImpl();
System.out.println("beanService: " + beanService);
return beanService;
}
@Bean
//@Bean 如果不知道name,默認(rèn)bean的name為方法名,下面等同于@Bean("beanService1")
public BeanService beanService1() {
BeanServiceImpl beanService1 = new BeanServiceImpl();
System.out.println("beanService1: " + beanService1);
return beanService1;
}
}
@Component
public class SetterBean {
private BeanService bs;
public SetterBean(BeanService beanService) {
bs = beanService;
System.out.println("有參構(gòu)造:" + bs);
}
}
二、創(chuàng)建實(shí)例的方式
- 通過(guò)Supplier的回調(diào)方法去創(chuàng)建
- 通過(guò)工廠(chǎng)方法去創(chuàng)建通過(guò)
- 反射構(gòu)造器去創(chuàng)建
絕大部分是通過(guò)反射構(gòu)造器去創(chuàng)建,詳情源碼見(jiàn)
AbstractAutowireCapableBeanFactory.doCreateBean中的createBeanInstance方法
三、反射構(gòu)造器結(jié)論現(xiàn)象
3.1 沒(méi)有有參構(gòu)造器
如果沒(méi)有有參構(gòu)造器,默認(rèn)使用無(wú)參的構(gòu)造方法反射創(chuàng)建實(shí)例,詳情見(jiàn)
createBeanInstance – instantiateBean方法
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
... ...
// No special handling: simply use no-arg constructor.
return instantiateBean(beanName, mbd);
}
3.2 有唯一的有參構(gòu)造器
如果有唯一有參構(gòu)造器,并且參數(shù)能在Spring容器里找到,則通過(guò)該有參構(gòu)造器反射創(chuàng)建
詳情見(jiàn)createBeanInstance – autowireConstructor方法
protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
... ...
// Candidate constructors for autowiring?
Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
return autowireConstructor(beanName, mbd, ctors, args);
}
... ...
}
如果參數(shù)不能在Spring容器中找到,就會(huì)報(bào)
NoUniqueBeanDefinitionException異常
3.3 有多個(gè)有參構(gòu)造器,不指定構(gòu)造器
有多個(gè)有參構(gòu)造器,Spring在創(chuàng)建Bean實(shí)例時(shí),就不知道用哪個(gè)構(gòu)造器去創(chuàng)建,就會(huì)報(bào)如下異常:
BeanInstantiationException: Failed to instantiate [XXX]: No default constructor found;
@Component
public class SetterBean {
private BeanService bs;
public SetterBean(BeanService beanService) {
bs = beanService;
System.out.println("有參構(gòu)造:" + bs);
}
//@Autowired
public SetterBean(BeanService beanService, BeanService beanService1) {
bs = beanService;
System.out.println("有參構(gòu)造:" + bs + "--------" + beanService1);
}
}
3.4 有多個(gè)有參構(gòu)造器,指定有參構(gòu)造
可以通過(guò)
像3.2 中,把@Autowired注釋打開(kāi),就會(huì)使用該有參構(gòu)造創(chuàng)建實(shí)例,啟動(dòng)就不會(huì)報(bào)異常,@Autowired來(lái)指定有參構(gòu)造來(lái)創(chuàng)建實(shí)例
四、createBeanInstance功能簡(jiǎn)介
這個(gè)方法主要是挑選構(gòu)造器,然后創(chuàng)建實(shí)例的
- 依次判斷使用哪種方式創(chuàng)建實(shí)例
- 有參構(gòu)造是否已經(jīng)解析過(guò),解析過(guò)就從緩存中拿解析過(guò)的構(gòu)造器去創(chuàng)建
- 沒(méi)有解析緩存過(guò),則通過(guò)后置處理器去獲取構(gòu)造器,參數(shù)如果需要注入,則autowireConstructor去注入?yún)?shù),然后創(chuàng)建實(shí)例
- 都不符合的話(huà)就拿默認(rèn)的無(wú)參構(gòu)造器去創(chuàng)建實(shí)例
到此這篇關(guān)于Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選的文章就介紹到這了,更多相關(guān)Bean實(shí)例創(chuàng)建及構(gòu)造器挑選內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Knife4j的請(qǐng)求示例當(dāng)中有很多空白行的問(wèn)題解決辦法
這篇文章主要介紹了Knife4j的請(qǐng)求示例當(dāng)中有很多空白行的問(wèn)題解決辦法,按正常來(lái)說(shuō)不應(yīng)該有上方的空白,當(dāng)然如果只是查看我也不至于非要解決他,主要是假如接口是json傳參,調(diào)試界面都沒(méi)辦法修改參數(shù),遇到同樣問(wèn)題的同學(xué)可以參考閱讀本文2024-09-09
Java動(dòng)態(tài)規(guī)劃之丑數(shù)問(wèn)題實(shí)例講解
這篇文章主要介紹了Java動(dòng)態(tài)規(guī)劃之丑數(shù)問(wèn)題實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09
Java基于Graphics2D實(shí)現(xiàn)海報(bào)制作
這篇文章主要為大家詳細(xì)介紹了Java如何基于Graphics2D實(shí)現(xiàn)海報(bào)制作,并且支持自定義顏色,背景,logo,貼圖,感興趣的小伙伴可以了解一下2024-04-04
SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置及項(xiàng)目打包部署上線(xiàn)功能
本文講解的是如何使用Spring動(dòng)態(tài)配置文件,實(shí)現(xiàn)不同環(huán)境不同配置,靈活切換配置文件;以及講述了如何使用?Maven?打包,然后上傳至Linux服務(wù)器進(jìn)行部署,對(duì)SpringBoot打包部署上線(xiàn)過(guò)程感興趣的朋友一起看看吧2022-10-10
Mybatis plus中的like查詢(xún)問(wèn)題
這篇文章主要介紹了Mybatis plus中的like查詢(xún)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
快速上手Mybatis-plus結(jié)構(gòu)構(gòu)建過(guò)程
這篇文章主要介紹了快速上手Mybatis-plus結(jié)構(gòu)構(gòu)建過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

