2019独角兽企业重金招聘Python工程师标准>>>

适用情况:
java代码里获得了一个对象,反序列化来的或者直接new的还是set进来的无所谓,这个对象依赖于ApplicationContext中配置的一些bean,需要注入依赖的bean。对象的具体类型未知,依赖哪些bean不确定。

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.support.FileSystemXmlApplicationContext;public class AutowireBeanProperties {public static void main(String[] args) throws Exception {/** 创建ApplicationContext,这里为了简单示例就不写xml文件而是用代码构建了。* 下面的代码相对于xml文件里有这么个bean:* <bean id="component" class="AutowireBeanProperties.ComponentImpl" />*/final ComponentImpl component = new ComponentImpl();FileSystemXmlApplicationContext context = new FileSystemXmlApplicationContext();context.addBeanFactoryPostProcessor(new BeanFactoryPostProcessor() {@Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {beanFactory.registerSingleton("component", component);}});context.refresh();/*创建ApplicationContext结束*/ComponentAware componentAware = new ComponentAware();context.getBeanFactory().autowireBeanProperties(componentAware, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false);System.out.println(componentAware.getComponent() == component);context.close();}public static interface Component {}public static class ComponentImpl implements Component {}public static class ComponentAware {private Component component;public Component getComponent() {return component;}public void setComponent(Component component) {this.component = component;}}
}

直接把autowireBeanProperties方法文档复制过来:

Autowire the bean properties of the given bean instance by name or type. Can also be invoked with AUTOWIRE_NO in order to just apply after-instantiation callbacks (e.g. for annotation-driven injection).

Does not apply standard BeanPostProcessors callbacks or perform any further initialization of the bean. This interface offers distinct, fine-grained operations for those purposes, for example initializeBean. However, InstantiationAwareBeanPostProcessor callbacks are applied, if applicable to the configuration of the instance.

这个方法只设置对象的属性,AutowireCapableBeanFactory.configureBean方法会做更多事情,具体的看spring文档。

存在的问题
一个对象如果要这样装配注入依赖,就会和SpringBean配置文件产生不明显的依赖关系。AUTOWIRE_BY_NAME的话就依赖于配置文件中的bean id;AUTOWIRE_BY_TYPE则会依赖于bean类型。
而且这样的依赖不明显,可能修改一下SpringBean配置文件,然后某个看起来完全不相关的地方的代码就因为依赖注入失败挂了。

解决办法 
1:让问题提前暴露
在SpringBean配置文件里显示的配置一个需要运行时注入依赖的对象, 设置autowire属性,让Spring自动装配它,然后写一个类实现org.springframework.beans.factory.InitializingBean接口,在Spring装配完对象后检查依赖注入是否完整。
这样就能提前发现会出现的依赖注入失败问题。
2:明确可以注入的依赖的名称/类型
从上面的代码可以看出,是可以在没有xml文件的情况下创建一个ApplicationContext的,然后把可以注入的依赖全部加入到ApplicationContext里,只用这个ApplicationContext来做运行时依赖注入。从而可以保证所有约定的可以注入的依赖都是存在的,bean id也都是确定的。

转载于:https://my.oschina.net/guyongquan/blog/495817

SpringBean装配非主流用法——给已存在的对象设置属性相关推荐

  1. 王学岗的属性动画上(二)——objectAnimator的非主流用法

    布局文件只有一张图片,不再列举 package com.example.propertyOfGang;import android.animation.ObjectAnimator; import a ...

  2. Spring----Bean装配

    一.Bean种类 1.普通Bean <bean id="" class="A">  :spring直接创建A实例对象并且返回 2.特殊Bean 如果 ...

  3. html5 ins标签,HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍

    HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍都在这里,本篇文章主要介绍了html ins标签用法和定义都有什么,还有一些html ins标签常用属性的介绍 HTML ins标签 ...

  4. ora-00955: 名称已由现有对象使用_ai使用路径的方法是什么?ai怎么使用路径查找器?...

    Illustrator路径使用教程: 1.使用铅笔或画笔工具重塑路径 您也可以重塑路径.为此,通过单击"铅笔"工具来选择其形状,以重塑没有画笔笔触的路径.如果具有笔触,请选择&qu ...

  5. 创建索引名称已由现有对象使用_Excel编程周末速成班第3课:Excel对象模型

    学习Excel技术,关注微信公众号: excelperfect 导语:为了帮助想要快速学会Excel VBA的朋友,特以<Excel Programming Weekend Crash Cour ...

  6. 已重置默认应用设置html,win10已重置应用默认设置一直弹怎么办_win10已重置应用默认设置老是弹出解决方法...

    有的用户可能会遇到已重置应用默认设置一直弹出的情况,这个情况让大家都很烦恼,不知道该怎么解决.那么win10已重置应用默认设置一直弹怎么办?这应该也是许多用户想知道的,下面我们就一起来看看win10已 ...

  7. 启动虚拟机异常(完整版)——如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从未重新启动,则Intel VT-x处于禁用状态

    "创建了Linux虚拟机",点击"开机"之后,报了这个错误!!! -----------------------笔记本电脑------------------- ...

  8. vmware如果已在BIOS/固件设置中禁用IntelVT-x,或主机自更改此设置后从未重新启动,则IntelVT-x

    以前装了个vmware,里面安装了Ubuntu Linux的系统,突然想研究下Docker,却发现虚拟机打不开了,提示'如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从 ...

  9. 此主机支持 AMD-V,但 AMD-V 处于禁用状态。 如果已在 BIOS/固件设置中禁用 AMD-V,或主机自更改此设置后从未重新启动,则 AMD-V 可能被禁用。 (1) 确认 BIOS/固

    前言 最近搭建虚拟机时报错: 错误信息如下: 此主机支持 AMD-V,但 AMD-V 处于禁用状态.如果已在 BIOS/固件设置中禁用 AMD-V,或主机自更改此设置后从未重新启动,则 AMD-V 可 ...

最新文章

  1. python点到多边形距离,点到轮廓距离
  2. SAP中过账码or记账码posting code
  3. 前端学习(1718):前端系列javascript之生命周期上
  4. 《Java8实战》笔记(03):Lambda表达式
  5. JavaScript的this关键字的调用位置和绑定
  6. RabbitMQ 高可用之镜像队列
  7. oracle asm 错误集
  8. spring是java ee框架吗,Java EE和Spring框架之间的区别
  9. 如何全面系统的自学Java?(附2022最新整理Java学习路线)
  10. lammps教程:Ovito查看晶体内部变形方法
  11. 抖音短视频矩阵系统源代码开发
  12. 黑苹果麦克风无法使用的问题(仅针对自己的配置)
  13. 分享一些做课题调查的方法
  14. mini-tokio代码分析
  15. linux表示一序列ip,linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
  16. uniapp使用uCharts区域图
  17. 通过简单的类和接口实现手机套餐办理服务
  18. 2022-2028年中国危化品运输行业市场深度分析及投资规模预测报告
  19. Qt中使用qrc管理和使用资源文件
  20. 「 周末去哪儿」安卓版免费下载 - 豌豆荚

热门文章

  1. hhvm mysql_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程
  2. 双卡双待 android,支持双卡双待+运行Android 5.1系统 华为Mate 8或9月2日登场
  3. 百度搜索框代码(有下拉提示的)
  4. @Validated 讲解
  5. 智能运动手环摄像机的作用是什么?
  6. 电商API接口用处以及未来的趋势
  7. 分享下.NET程序读取二代身份证(附源码
  8. Javascript获取URL地址的参数
  9. 虫师python appium自动化测试书_appium对博客园APP进行自动化测试
  10. 神器面世:快速生成你的专属卡通头像!