电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

springboot 實現bean手動注入操作

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

1、springboot啟動類實現接口ApplicationListener<ContextRefreshedEvent>,實現方法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( '啟動成功' ); } @Override public void onApplicationEvent(ContextRefreshedEvent event) { SpringContextUtil.setApplicationContext(event.getApplicationContext()); }}

2.SpringContextUtil工具類初始化ApplicationContext applicationContext

package test.projectTest.util;import org.springframework.context.ApplicationContext;/** * 獲取spring容器,以訪問容器中定義的其他bean */public class SpringContextUtil{ //spring上下文 private static ApplicationContext applicationContext; /** * 實現ApplicationContextAware接口的回調方法,設置上下文環境 * @param applicationContext */ public static void setApplicationContext(ApplicationContext applicationContext){ if(null==SpringContextUtil.applicationContext) SpringContextUtil.applicationContext=applicationContext; } public static ApplicationContext getApplicationContext(){ return applicationContext; } /** * 通過name獲取 Bean. * * @param name * @return */ public static Object getBean(String name) { return getApplicationContext().getBean(name); } /** * 通過name獲取 Bean. * * @param clazz * @return */ public static <T> T getBean(Class<T> clazz) { return getApplicationContext().getBean(clazz); } /** * 通過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{//手動注入bean if(dailyDataMapper==null){ dailyDataMapper = (DailyDataMapper)SpringContextUtil.getBean('dailyDataMapper'); } } public static void test(){ dailyDataMapper.selectByPrimaryKey(1); } }

補充:springboot中bean的實例化和屬性注入過程

springboot版本(2.0.4 RELEASE)

大致描述springboot中bean的實例化和屬性注入過程流程

1) 在某一時刻Spring調用了Bean工廠的getBean(beanName)方法。beanName可能是simpleController,或者simpleService,simpleDao,順序沒關系(因為后面會有依賴關系的處理)。我們假設simpleController吧

2)getBean方法首先會調用Bean工廠中定義的getSingleton(beanName)方法,來判斷是否存在該名字的bean單例,如果存在則返回,方法調用結束(spring默認是單例,這樣可以提高效率)

3) 否則,Spring會檢查是否存在父工廠,如果有則返回,方法調用結束

4) 否則,Spring會檢查bean定義(BeanDefinition實例,用來描述Bean結果,component-scan掃描后,就是將beanDefinition實例放入Bean工廠,此時還沒有被實例化)是否有依賴關系,如果有,執行1)步,獲取依賴的bean實例

5) 否則,Spring會嘗試創建這個bean實例,創建實例前,Spring會檢查調用的構造器,并實例化該Bean,(通過Constructor.newInstance(args)進行實例化)

6) 實例化完成后,Spring會調用Bean工廠的populateBean方法來填充bean實例的屬性,也就是自動裝配。populateBean方法便是調用了BeanPostProcessor實例來完成屬性元素的自動裝配工作

7)在元素裝配過程中,Spring會檢查被裝配的屬性是否存在自動裝配的其他屬性,然后遞歸調用getBean方法,知道所有@Autowired的元素都被裝配完成。如在裝配simpleController中的simpleService屬性時,發現SimpleServiceImpl實例中存在@Autowired屬性simpleDao,然后調用getBean(simpleDao)方法,同樣會執行1)----7)整個過程。所有可以看成一個遞歸過程。

8)裝配完成后,Bean工廠會將所有的bean實例都添加到工廠中來。

Bean的實例化

1. 進入SpringApplication類中refreshContext()方法

springboot 實現bean手動注入操作

2. 進入AbstractApplicationContext類中refresh()方法,找到this.finishBeanFactoryInitialization()方法,這個方法就是完成beanFactory的實例化

springboot 實現bean手動注入操作

3. 進入AbstractApplicationContext類中finishBeanFactoryInitialization()方法,找到preInstantiateSingletons()

springboot 實現bean手動注入操作

4. 進入DefaultListableBeanFactory類中preInstantiateSingletons()方法,找到getBean()方法

springboot 實現bean手動注入操作

5. 進入AbstractBeanFactory類中getBean()方法,找到doGetBean()方法

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

7. 進入AbstractAutowireCapableBeanFactory類中createBean方法中,找到doCreateBean()方法

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

12. 在BeanUtils類instantiateClass()方法中,可知bean的實例化是通過Constructor.newInstance()進行實例化

springboot 實現bean手動注入操作

Bean的屬性注入

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

springboot 實現bean手動注入操作

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

springboot 實現bean手動注入操作

3. 進入AutowiredAnnotationBeanPostProcessor類中postProcessPropertyValues()方法中,找到findAutowiringMetadata()方法,在這個方法中,如果屬性中含有@Autowired注解則會遞歸getBean()。沒有然后進入inject()方法中

springboot 實現bean手動注入操作

4. 進入AutowiredAnnotationBeanPostProcessor類inject方法中,找到resolveDependency()方法,通過這個方法獲取對應字段的值

springboot 實現bean手動注入操作

5. 進入AutowiredAnnotationBeanPostProcessor類inject方法中,找到field.set(bean, value)方法,通過反射將值設置到屬性中

springboot 實現bean手動注入操作

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持好吧啦網。如有錯誤或未考慮完全的地方,望不吝賜教。

標簽: Spring
相關文章:
主站蜘蛛池模板: 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 低温柔性试验仪-土工布淤堵-沥青车辙试验仪-莱博特(天津)试验机有限公司 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | 考勤系统_考勤管理系统_网络考勤软件_政企|集团|工厂复杂考勤工时统计排班管理系统_天时考勤 | 成人纸尿裤,成人尿不湿,成人护理垫-山东康舜日用品有限公司 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 原子吸收设备-国产分光光度计-光谱分光光度计-上海光谱仪器有限公司 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 山东艾德实业有限公司 | 置顶式搅拌器-优莱博化学防爆冰箱-磁驱搅拌器-天津市布鲁克科技有限公司 | 百度网站优化,关键词排名,SEO优化-搜索引擎营销推广 | 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 广州/东莞小字符喷码机-热转印打码机-喷码机厂家-广州瑞润科技 | 北京开业庆典策划-年会活动策划公司-舞龙舞狮团大鼓表演-北京盛乾龙狮鼓乐礼仪庆典策划公司 | 玉米深加工机械,玉米加工设备,玉米加工机械等玉米深加工设备制造商-河南成立粮油机械有限公司 | 东莞螺丝|东莞螺丝厂|东莞不锈钢螺丝|东莞组合螺丝|东莞精密螺丝厂家-东莞利浩五金专业紧固件厂家 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 智慧消防-消防物联网系统云平台 智能化的检漏仪_气密性测试仪_流量测试仪_流阻阻力测试仪_呼吸管快速检漏仪_连接器防水测试仪_车载镜头测试仪_奥图自动化科技 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 东莞市天进机械有限公司-钉箱机-粘箱机-糊箱机-打钉机认准东莞天进机械-厂家直供更放心! | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 胜为光纤光缆_光纤跳线_单模尾纤_光纤收发器_ODF光纤配线架厂家直销_北京睿创胜为科技有限公司 - 北京睿创胜为科技有限公司 | 盛源真空泵|空压机-浙江盛源空压机制造有限公司-【盛源官网】 | 开业庆典_舞龙舞狮_乔迁奠基仪式_开工仪式-神挚龙狮鼓乐文化传媒 | 专业深孔加工_东莞深孔钻加工_东莞深孔钻_东莞深孔加工_模具深孔钻加工厂-东莞市超耀实业有限公司 | 交流伺服电机|直流伺服|伺服驱动器|伺服电机-深圳市华科星电气有限公司 | 北京包装设计_标志设计公司_包装设计公司-北京思逸品牌设计 | 广州食堂承包_广州团餐配送_广州堂食餐饮服务公司 - 旺记餐饮 | 中国品牌排名投票_十大品牌榜单_中国著名品牌【中国品牌榜】 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 动物解剖台-成蚊接触筒-标本工具箱-负压实验台-北京哲成科技有限公司 | 工业插头-工业插头插座【厂家】-温州罗曼电气 | 信阳市建筑勘察设计研究院有限公司| 流变仪-热分析联用仪-热膨胀仪厂家-耐驰科学仪器商贸 | 冷凝锅炉_燃气锅炉_工业燃气锅炉改造厂家-北京科诺锅炉 | 硬度计_影像测量仪_维氏硬度计_佛山市精测计量仪器设备有限公司厂家 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 |