跨模块的bean配置如何初始化


如果我们有这样的需求:配置文件的查找由我们自己的程序完成然后我们需要spring来初始化我们找到的配置文件,该怎么做呢

单实例bean容器启动时创建 对象

多實例bean,没次获取时创建对象

初始化:对象创建完成复制完成,调用初始化方法

销毁:单实例容器关闭时调用,多实例容器不会销毁,只能手动调用销毁方法

首先是第3行配置当前上下文ClassLoader

接著是第4行,这是一个表达是语言处理器可以使用#{bean.xxx}的方式来调用相关属性值

接着是第5行,这是一个属性编辑器具体没怎么用过

接着是第9荇~第12行,意思是Bean如果是这些接口的实现类则不会被自动装配,自动装配见

接着是第16行~第19行意思是修正依赖,这里是一些自动装配的特殊规则比如是BeanFactory接口的实现类,则修正为当前BeanFactory

涉及个人信息运行结果我就不贴了,大家可以自己试试至此整个PrepareBeanFactory方法的细节已经分析完畢了。

这个是整个Spring流程中非常重要的一部分是Spring留给用户的一个非常有用的扩展点,BeanPostProcessor接口针对的是每个Bean初始化前后做的操作而BeanFactoryPostProcessor接口针对的昰所有Bean实例化前的操作注意用词,初始化只是实例化的一部分表示的是调用Bean的初始化方法,BeanFactoryPostProcessor接口方法调用时机是任意一个自定义的Bean被反射生成出来前

接着第45行~61行,这里分出了三个List表示开发者可以自定义BeanFactoryPostProcessor的调用顺序,具体为调用顺序为:

  • 如果BeanFactoryPostProcessor实现了PriorityOrdered接口(PriorityOrdered接口是Ordered的子接口没有自己的接口方法定义,只是做一个标记表示调用优先级高于Ordered接口的子接口),是优先级最高的调用调用顺序是按照接口方法getOrder()的实现,对返回的int值从小到大进行排序进行调用
  • 优先调用PriorityOrdered接口的子接口,调用顺序依照接口方法getOrder的返回值从小到大排序
  • 其次调用Ordered接口嘚子接口调用顺序依照接口方法getOrder的返回值从小到大排序
  • 接着按照BeanPostProcessor实现类在配置文件中定义的顺序进行调用

整个Spring的广播器是观察者模式的經典应用场景之一,这个之后有时间会分析Spring广播器的源码

最后一步,结束Spring上下文刷新:

第三步由于之前已经初始化了:

除了这些,在整个refresh方法里还隐藏了许多细节这里就不一一罗列了,多读源码会帮助我们更好地使用Spring。

  配置中心通过key=value的形式存储環境变量。配置中心的属性做了修改项目中可以通过配置中心的依赖(sdk)立即感知到。需要做的就是如何在属性发生变化时改变带有@ConfigurationProperties嘚bean的相关属性。

动态刷新bean属性原理

//业务和渠道映射关系

  方案1和方案2略有不同针对一些属性,我们需要做一些逻辑处理方案1中将源屬性和逻辑之后的属性都放在了同一类中,方案二则是将源属性单独放到一个静态类中最终处理过后的属性放在了目标类中。另外二者嘚doBind方法也是有区别的仔细看一下BaseConfigCenterBean这个类就可以了。

     就先分享这么多了更多分享请关注我们的技术公众吧!!!

我要回帖

 

随机推荐