@Value是如何起作用的

1、Spirng在生命周期里关于Bean的处理大概可以分为下面几步:

1)加载Bean定义(从xml或者从@Import等)

2)处理BeanFactoryPostProcessor,可修改BeanDefinition属性

3)实例化Bean

4)处理Bean的property注入

5)处理BeanPostProcessor,可修改实例化的Bean的属性值(@Value注入Bean的属性值是通过它)

而当我们在声明了<context:property-placeholder location="classpath:config.properties"/>标签之后,即声明了一个配置型bean交给Spring容器进行管理,即PropertyPlaceholderConfigurer类。我们先看一下这个类的继承结构。

2、自定义BeanFactoryPostProcessor(bean implements BeanFactoryPostProcessor),创建StringValueResolver对象,自定义String变量的值解析方法resolveStringValue(String strVal),将StringValueResolver对象添加到ConfigurableListableBeanFactory beanFactoryToProcess对象的embeddedValueResolvers列表中

3、注解修饰的类的实例对象是通过AbstractAutowireCapableBeanFactory的doCreateBean方法实例化的,然后由AutowiredAnnotationBeanPostProcessor的postProcessPropertyValues方法注入属性值(element.inject() -> beanFactory.resolveDependency() -> resolveEmbeddedValue() -> 遍历embeddedValueResolvers列表,执行resolver.resolveStringValue() -> 自定义的StringValueResolver对象的resolveStringValue方法),至此,完成自定义属性值注入的逻辑。

4、通常设置spring配置文件的方式如下

如引文中所说,使用的是PropertyPlaceholderConfigurer类,主要流程如下

PropertyResourceConfigurer主流程中的三个方法,第一步已经执行完毕,加载了配置的properties文件,第二步是spring自己的默认实现,将非空的key对应的value放入Properties中,第三步则该由子类各自实现了,将BeanFactory与Properties进行统一操作。这时候我们看我们直接声明的派生类PropertyPlaceholderConfigurer。

PlaceHolderResolvingStringValueResolver就是解析properties文件中key-value键值对的类,可以自定义的,需要通过BeanFactoryPostProcessor添加到BeanFactory中的resolvers列表中。

引文中解释第2步是在对实例注入value值,实际测试发现并不是,并没有注入值(BeanFactoryPostProcessor可以修改BeanDefinition定义,不会修改Bean实例的值,因为此时并未实例化Bean);另外也测试了下是不是在为类成员变量注入值,也不是!所以对这一点比还是较迷惑,待确认

第4步则是在将解析properties文件中key-value键值对的实例对象添加到BeanFactory中的resolvers列表中,会在实例化Bean之后调用AutowiredAnnotationBeanPostProcessor类的postProcessPropertyValues方法中被调用。


https://www.cnblogs.com/kingszelda/p/7261156.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 昨晚和一群老友相聚,玩得非常尽兴,只是今天有点晕晕乎乎的,总是呈现一种发呆的状态。 每隔一段时间我便会召集...
    D061张琴阅读 194评论 0 0
  • 一.回顾课程内容 这次课程的重点就是在文章中抓重点,理顺脉络。显然是也是难点,上次的作业在云里雾里整理了一篇散文...
    莉jasmine阅读 470评论 1 7
  • 【西山居开头动画】 ——————第一部分—————— #场景一 【茶楼】【npc*2,小二,二少花姐】 [bgm:...
    关根_阅读 1,827评论 0 1
  • 返航的最后一天,发现是马航360,坐上的那一刻,想起了三十年前那个帅气任性的男孩,在跟同学骑行去哈市的途中,溺水上...
    xiangchong2018阅读 334评论 0 0
  • 大四了,仍旧孤家寡人一个,朋友一夜间都像是月老下凡,施施然忙着给我介绍对象。虽然每次都以不想谈恋爱,学业为重为由推...
    刘露丹阅读 714评论 0 1