上方蓝色“程序员追风”,选择“设为星标”

回复“资料”获取整理好的面试资料

来源:juejin.cn/post/7283803914645569536

我们都知道Spring在创建一个bean的时候,还要去填充bean的属性

大致流程如下:

  • 反射创建bean——createBeanInstance

  • 填充bean——populateBean

  • 初始化bean——initializeBean(包括前后置增强)

  • 注册bean的销毁方法——registerDisposableBeanIfNecessary

这个填充bean的逻辑是在populateBean

//InjectionMetadata.injectpublicvoidinject(Objecttarget,@NullableStringbeanName,@NullablePropertyValuespvs)throwsThrowable{Collection<InjectedElement>checkedElements=this.checkedElements;Collection<InjectedElement>elementsToIterate=(checkedElements!=null?checkedElements:this.injectedElements);if(!elementsToIterate.isEmpty()){for(InjectedElementelement:elementsToIterate){element.inject(target,beanName,pvs);}}}

element的逻辑就暂时省略了,大概就是如果是字段,那么通过反射去注入,如果是方法,也通过反射去执行

@Resource与以上大致同理

总结

总的来说,就一句话,spring在使用字段注入对静态字段进行注入时,会忽略掉这个字段,不去注入

也就是说Spring是有能力去注入静态字段的,但是Spring没有选择注入,为什么呢?

可能是因为Spring的设计理念是管理bean对象,只有属于对象的字段Spring才去进行管理,如果是static的话,那么这个字段属于类了,这个时候Spring去进行管理貌似不符合它的设计理念,所以Spring直接忽略掉了;另外如果一个bean修改了这个字段,那么所有bean的这个字段都会受到影响,因为这个字段是属于类的,这个时候可能就会问题

那么有没有办法实现静态字段注入呢?

可以的,在方法中打上@Autowired注解,在方法里面去对静态字段进行赋值,当然这个方法也不能是静态的,否则也会被spring会忽略掉

不过如果能够不对静态字段注入就尽量不要注入,因为spring本身就不鼓励我们这么做,这种不鼓励已经深入到代码里面了

你在看吗

本篇文章来源于微信公众号: 程序员追风



微信扫描下方的二维码阅读本文

此作者没有提供个人介绍
最后更新于 2024-05-09