亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Spring Bean實(shí)例的創(chuàng)建及構(gòu)造器的挑選

瀏覽:52日期:2023-07-17 10:48:37
一、舉個(gè)栗子

public class BeanServiceImpl implements BeanService {}

@Configurationpublic 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; }}

@Componentpublic 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ò)工廠方法去創(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;

@Componentpublic 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ò)@Autowired來(lái)指定有參構(gòu)造來(lái)創(chuàng)建實(shí)例

像3.2 中,把@Autowired注釋打開(kāi),就會(huì)使用該有參構(gòu)造創(chuàng)建實(shí)例,啟動(dòng)就不會(huì)報(bào)異常, 四、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í)例 都不符合的話就拿默認(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)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 深夜影院一级毛片 | 日本免费va毛片在线看大 | 久久亚洲美女久久久久 | 99久久免费看精品国产一区 | 精品福利一区二区三区免费视频 | 91久久综合九色综合欧美98 | 黄色片播放器 | 国内女高中生一级毛片 | 国产欧美精品一区二区三区四区 | 日韩字幕一中文在线综合 | 青草伊伊 | 亚洲精品第一国产综合高清 | 日本色图视频 | 99黄色| 欧美a级片免费观看 | 亚洲免费三区 | 精品国产国产综合精品 | 亚洲最大的黄色网址 | 91精品啪在线看国产网站 | 日本久久中文字幕 | 国产特级毛片aaaaaaa高清 | 日日噜噜夜夜狠狠tv视频免费 | 精品日本亚洲一区二区三区 | 久久精品一区二区三区不卡 | 日本aaaa特级毛片 | 9966久久精品免费看国产 | 欧美日韩视频精品一区二区 | 国产精品久久久久久久久久一区 | 日韩 亚洲 欧美 中文 高清 | 福利片在线观看免费高清视频 | 综合欧美一区二区三区 | 免费黄色看片网站 | 韩国一级做a爱性色毛片 | 国内精品免费 | 六月婷婷七月丁香 | 久久人体做爰大胆图片 | 成年人黄色一级片 | 国产自愉自愉全免费高清 | 最新lutube亚洲看片在线观看 | 亚洲黄色片| 特黄特黄视频 |