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

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

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

瀏覽:2日期:2023-03-27 13:50:23

1、springboot啟動(dòng)類(lèi)實(shí)現(xiàn)接口ApplicationListener<ContextRefreshedEvent>,實(shí)現(xiàn)方法onApplicationEvent,初始化上下文

package test.projectTest;import org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;import org.springframework.boot.system.ApplicationPidFileWriter;import org.springframework.context.ApplicationListener;import org.springframework.context.event.ContextRefreshedEvent;import test.projectTest.util.SpringContextUtil;@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class, MybatisAutoConfiguration.class})@SpringBootApplication(scanBasePackages={'test.projectTest'})public class TestApplication implements ApplicationListener<ContextRefreshedEvent>{ public static void main( String[] args ) { SpringApplication application = new SpringApplication(TestApplication.class); application.addListeners(new ApplicationPidFileWriter()); application.run(args); System.out.println( '啟動(dòng)成功' ); } @Override public void onApplicationEvent(ContextRefreshedEvent event) { SpringContextUtil.setApplicationContext(event.getApplicationContext()); }}

2.SpringContextUtil工具類(lèi)初始化ApplicationContext applicationContext

package test.projectTest.util;import org.springframework.context.ApplicationContext;/** * 獲取spring容器,以訪(fǎng)問(wèn)容器中定義的其他bean */public class SpringContextUtil{ //spring上下文 private static ApplicationContext applicationContext; /** * 實(shí)現(xiàn)ApplicationContextAware接口的回調(diào)方法,設(shè)置上下文環(huán)境 * @param applicationContext */ public static void setApplicationContext(ApplicationContext applicationContext){ if(null==SpringContextUtil.applicationContext) SpringContextUtil.applicationContext=applicationContext; } public static ApplicationContext getApplicationContext(){ return applicationContext; } /** * 通過(guò)name獲取 Bean. * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通過(guò)name獲取 Bean. * * @param clazz * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通過(guò)name,以及Clazz返回指定的Bean * * @param name * @param clazz * @return */ public static <T> T getBean(String name, Class<T> clazz) { return getApplicationContext().getBean(name, clazz); }}

3.獲取bean

package test.projectTest.util;import test.projectTest.mapper.slave.DailyDataMapper;public class TestUtil{ private static DailyDataMapper dailyDataMapper; static{//手動(dòng)注入bean if(dailyDataMapper==null){ dailyDataMapper = (DailyDataMapper)SpringContextUtil.getBean('dailyDataMapper'); } } public static void test(){ dailyDataMapper.selectByPrimaryKey(1); } }

補(bǔ)充:springboot中bean的實(shí)例化和屬性注入過(guò)程

springboot版本(2.0.4 RELEASE)

大致描述springboot中bean的實(shí)例化和屬性注入過(guò)程流程

1) 在某一時(shí)刻Spring調(diào)用了Bean工廠(chǎng)的getBean(beanName)方法。beanName可能是simpleController,或者simpleService,simpleDao,順序沒(méi)關(guān)系(因?yàn)楹竺鏁?huì)有依賴(lài)關(guān)系的處理)。我們假設(shè)simpleController吧

2)getBean方法首先會(huì)調(diào)用Bean工廠(chǎng)中定義的getSingleton(beanName)方法,來(lái)判斷是否存在該名字的bean單例,如果存在則返回,方法調(diào)用結(jié)束(spring默認(rèn)是單例,這樣可以提高效率)

3) 否則,Spring會(huì)檢查是否存在父工廠(chǎng),如果有則返回,方法調(diào)用結(jié)束

4) 否則,Spring會(huì)檢查bean定義(BeanDefinition實(shí)例,用來(lái)描述Bean結(jié)果,component-scan掃描后,就是將beanDefinition實(shí)例放入Bean工廠(chǎng),此時(shí)還沒(méi)有被實(shí)例化)是否有依賴(lài)關(guān)系,如果有,執(zhí)行1)步,獲取依賴(lài)的bean實(shí)例

5) 否則,Spring會(huì)嘗試創(chuàng)建這個(gè)bean實(shí)例,創(chuàng)建實(shí)例前,Spring會(huì)檢查調(diào)用的構(gòu)造器,并實(shí)例化該Bean,(通過(guò)Constructor.newInstance(args)進(jìn)行實(shí)例化)

6) 實(shí)例化完成后,Spring會(huì)調(diào)用Bean工廠(chǎng)的populateBean方法來(lái)填充bean實(shí)例的屬性,也就是自動(dòng)裝配。populateBean方法便是調(diào)用了BeanPostProcessor實(shí)例來(lái)完成屬性元素的自動(dòng)裝配工作

7)在元素裝配過(guò)程中,Spring會(huì)檢查被裝配的屬性是否存在自動(dòng)裝配的其他屬性,然后遞歸調(diào)用getBean方法,知道所有@Autowired的元素都被裝配完成。如在裝配simpleController中的simpleService屬性時(shí),發(fā)現(xiàn)SimpleServiceImpl實(shí)例中存在@Autowired屬性simpleDao,然后調(diào)用getBean(simpleDao)方法,同樣會(huì)執(zhí)行1)----7)整個(gè)過(guò)程。所有可以看成一個(gè)遞歸過(guò)程。

8)裝配完成后,Bean工廠(chǎng)會(huì)將所有的bean實(shí)例都添加到工廠(chǎng)中來(lái)。

Bean的實(shí)例化

1. 進(jìn)入SpringApplication類(lèi)中refreshContext()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

2. 進(jìn)入AbstractApplicationContext類(lèi)中refresh()方法,找到this.finishBeanFactoryInitialization()方法,這個(gè)方法就是完成beanFactory的實(shí)例化

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

3. 進(jìn)入AbstractApplicationContext類(lèi)中finishBeanFactoryInitialization()方法,找到preInstantiateSingletons()

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

4. 進(jìn)入DefaultListableBeanFactory類(lèi)中preInstantiateSingletons()方法,找到getBean()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

5. 進(jìn)入AbstractBeanFactory類(lèi)中g(shù)etBean()方法,找到doGetBean()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

6. 在AbstractBeanFactory類(lèi)中doGetBean方法中,找到createBean()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

7. 進(jìn)入AbstractAutowireCapableBeanFactory類(lèi)中createBean方法中,找到doCreateBean()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

8. 在AbstractAutowireCapableBeanFactory類(lèi)中doCreateBean()方法中,找到createBeanInstance()方法,看名字就知道是實(shí)例化bean的

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

9. 在AbstractAutowireCapableBeanFactory類(lèi)createBeanInstance()方法中,找到instantiateBean()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

10. 在AbstractAutowireCapableBeanFactory類(lèi)instantiateBean()方法中,找到instantiate()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

11. 在SimpleInstantiationStrategy類(lèi)instantiate()方法中,找到instantiateClass()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

12. 在BeanUtils類(lèi)instantiateClass()方法中,可知bean的實(shí)例化是通過(guò)Constructor.newInstance()進(jìn)行實(shí)例化

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

Bean的屬性注入

1. 在AbstractAutowireCapableBeanFactory類(lèi)doCreateBean()方法中,找到populateBean()方法,從名字可知是用來(lái)填充bean的

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

2. 在AbstractAutowireCapableBeanFactory類(lèi)中populateBean()方法,找到postProcessPropertyValues()方法

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

3. 進(jìn)入AutowiredAnnotationBeanPostProcessor類(lèi)中postProcessPropertyValues()方法中,找到findAutowiringMetadata()方法,在這個(gè)方法中,如果屬性中含有@Autowired注解則會(huì)遞歸getBean()。沒(méi)有然后進(jìn)入inject()方法中

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

4. 進(jìn)入AutowiredAnnotationBeanPostProcessor類(lèi)inject方法中,找到resolveDependency()方法,通過(guò)這個(gè)方法獲取對(duì)應(yīng)字段的值

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

5. 進(jìn)入AutowiredAnnotationBeanPostProcessor類(lèi)inject方法中,找到field.set(bean, value)方法,通過(guò)反射將值設(shè)置到屬性中

springboot 實(shí)現(xiàn)bean手動(dòng)注入操作

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 在线观看欧洲成人免费视频 | 久久久99精品久久久 | 免费黄色在线 | 欧美日韩成人在线观看 | 国产一级视频在线观看网站 | 一区二区在线视频免费观看 | 亚洲 欧美 国产 日韩 制服 bt | 久久免费视频播放 | 国产精品爱久久久 | 亚洲在线高清 | 久久99精品国产一区二区三区 | 一级性黄色片 | 亚洲色图第一页 | 久久精品播放 | 国产成人高清在线 | 福利视频在线观看www. | 精品日韩在线视频 | 国产第二页 | 福利视频不卡 | 人体大胆做受免费视频 | 免费人成网站在线高清 | 欧美高清夜夜片a | 国产精品自线在线播放 | 99热国产这里只有精品免费 | 亚洲欧美一级久久精品 | 中国一级一级全黄 | 香港三级毛片 | 一级毛片免费一级直接观看 | 91看片在线观看 | 国产福利一区视频 | 91在线精品 | 亚洲图片色图 | 午夜不卡视频 | 热综合一本伊人久久精品 | 国产主播大尺度精品福利 | 韩国三级欧美三级国产三级 | 亚洲一区二区久久 | www.一区 | 在线欧美三级 | 欧美日韩久久毛片 | 成人亚洲欧美综合 |