快捷搜索:  汽车  科技

spring的bean注入过程:竟然不知如何往spring注入bean

spring的bean注入过程:竟然不知如何往spring注入bean如上思想很简单,就是从spring context上下文中取出beanFactory 然后往里面注册一个创建好的bean。但是由于spring beanFactory 关系以及依赖很复杂,看似简单的答案,其实并不是很容易。public void setBean(String name Object o) { AbstractAutowireCapableBeanFactory autowireCapableBeanFactory = (AbstractAutowireCapableBeanFactory) context.getAutowireCapableBeanFactory(); autowireCapableBeanFactory.registerSingleton(name o); } 我的第一直觉很简单呀,就是往beanFactory中放一个新建的bean,但是我

场景

昨天晚上线上出现了一个故障,我们团队加班到凌晨2点半才解决。故障的原因不好定位,陈年老码一直跑的好好的,最近也没有代码改动,回滚代码等都不好使,就是硬生生的启动不起来,启动过程有一个空指针异常,没有行信息等,所有的证据都指示不可能为空。

最终定位到原因是系统依赖的一个框架本身的bug。由于此bug与我们团队使用的框架有关系没有共性,此处不表。

问题以及解决

本文单单整理下排查过程中,我们抛出来的一个问题?项目中直接new出来的bean,如何注入到spring容器中,让spring代为接管?

我记得之前貌似也见过,有些框架中的生成的bean 为了方便spring用户使用,也会简单的适配一下,将框架中生成的单例bean,注入到spring容器。

我的第一直觉很简单呀,就是往beanFactory中放一个新建的bean,但是我们组几个资深开发硬是花了一个多小时各种查资料才解决。事后想了下,主要是中文资料鱼龙混杂,英文的资料也好不到那里去;再者对spring不够熟悉,框架类的关系复杂,仓促之间不能够理解。

首先直接上最终的代码如下图,核心代码如下图红框:

spring的bean注入过程:竟然不知如何往spring注入bean(1)

public void setBean(String name Object o) { AbstractAutowireCapableBeanFactory autowireCapableBeanFactory = (AbstractAutowireCapableBeanFactory) context.getAutowireCapableBeanFactory(); autowireCapableBeanFactory.registerSingleton(name o); }

如上思想很简单,就是从spring context上下文中取出beanFactory 然后往里面注册一个创建好的bean。但是由于spring beanFactory 关系以及依赖很复杂,看似简单的答案,其实并不是很容易。

第一个问题 BeanFactory 和 ApplicationContext 是什么关系?

两者都是可以加载bean的,但是相比之下ApplicationContext 提供了更多的扩展功能。

如果一个类实现了ApplicationContextAware接口,spring 创建bean的时候会自动注入ApplicationContext,大家获取ApplicationContext的成本很低,所以ApplicationContext被大家更多使用。

第二问题,spring继承关系复杂,BeanFactory和ApplicationContext的鼻祖是啥?

GenericApplicationContext是ApplicationContext的鼻祖。各种特定场景的ApplicationContext都是基于它创建的

spring的bean注入过程:竟然不知如何往spring注入bean(2)

BeanFactory的鼻祖是谁?

DefaultListableBeanFactory是容器的基础。GenericApplicationContext也持有DefaultListableBeanFactory的引用。

结论

通过DefaultListableBeanFactory的继承关系,我们可以看到它继承自AbstractAutowireCapableBeanFactory,而此抽象类中含有我们需要的注册bean的功能。

猜您喜欢: