SpringBean装配非主流用法——给已存在的对象设置属性
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装配非主流用法——给已存在的对象设置属性相关推荐
- 王学岗的属性动画上(二)——objectAnimator的非主流用法
布局文件只有一张图片,不再列举 package com.example.propertyOfGang;import android.animation.ObjectAnimator; import a ...
- Spring----Bean装配
一.Bean种类 1.普通Bean <bean id="" class="A"> :spring直接创建A实例对象并且返回 2.特殊Bean 如果 ...
- html5 ins标签,HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍
HTML ins标签常用的用法有哪些?HTML ins常用属性的介绍都在这里,本篇文章主要介绍了html ins标签用法和定义都有什么,还有一些html ins标签常用属性的介绍 HTML ins标签 ...
- ora-00955: 名称已由现有对象使用_ai使用路径的方法是什么?ai怎么使用路径查找器?...
Illustrator路径使用教程: 1.使用铅笔或画笔工具重塑路径 您也可以重塑路径.为此,通过单击"铅笔"工具来选择其形状,以重塑没有画笔笔触的路径.如果具有笔触,请选择&qu ...
- 创建索引名称已由现有对象使用_Excel编程周末速成班第3课:Excel对象模型
学习Excel技术,关注微信公众号: excelperfect 导语:为了帮助想要快速学会Excel VBA的朋友,特以<Excel Programming Weekend Crash Cour ...
- 已重置默认应用设置html,win10已重置应用默认设置一直弹怎么办_win10已重置应用默认设置老是弹出解决方法...
有的用户可能会遇到已重置应用默认设置一直弹出的情况,这个情况让大家都很烦恼,不知道该怎么解决.那么win10已重置应用默认设置一直弹怎么办?这应该也是许多用户想知道的,下面我们就一起来看看win10已 ...
- 启动虚拟机异常(完整版)——如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从未重新启动,则Intel VT-x处于禁用状态
"创建了Linux虚拟机",点击"开机"之后,报了这个错误!!! -----------------------笔记本电脑------------------- ...
- vmware如果已在BIOS/固件设置中禁用IntelVT-x,或主机自更改此设置后从未重新启动,则IntelVT-x
以前装了个vmware,里面安装了Ubuntu Linux的系统,突然想研究下Docker,却发现虚拟机打不开了,提示'如果已在 BIOS/固件设置中禁用 Intel VT-x,或主机自更改此设置后从 ...
- 此主机支持 AMD-V,但 AMD-V 处于禁用状态。 如果已在 BIOS/固件设置中禁用 AMD-V,或主机自更改此设置后从未重新启动,则 AMD-V 可能被禁用。 (1) 确认 BIOS/固
前言 最近搭建虚拟机时报错: 错误信息如下: 此主机支持 AMD-V,但 AMD-V 处于禁用状态.如果已在 BIOS/固件设置中禁用 AMD-V,或主机自更改此设置后从未重新启动,则 AMD-V 可 ...
最新文章
- python点到多边形距离,点到轮廓距离
- SAP中过账码or记账码posting code
- 前端学习(1718):前端系列javascript之生命周期上
- 《Java8实战》笔记(03):Lambda表达式
- JavaScript的this关键字的调用位置和绑定
- RabbitMQ 高可用之镜像队列
- oracle asm 错误集
- spring是java ee框架吗,Java EE和Spring框架之间的区别
- 如何全面系统的自学Java?(附2022最新整理Java学习路线)
- lammps教程:Ovito查看晶体内部变形方法
- 抖音短视频矩阵系统源代码开发
- 黑苹果麦克风无法使用的问题(仅针对自己的配置)
- 分享一些做课题调查的方法
- mini-tokio代码分析
- linux表示一序列ip,linux 下查看硬件信息(mac,IP地址,硬盘型号,序列号等)
- uniapp使用uCharts区域图
- 通过简单的类和接口实现手机套餐办理服务
- 2022-2028年中国危化品运输行业市场深度分析及投资规模预测报告
- Qt中使用qrc管理和使用资源文件
- 「 周末去哪儿」安卓版免费下载 - 豌豆荚
热门文章
- hhvm mysql_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程
- 双卡双待 android,支持双卡双待+运行Android 5.1系统 华为Mate 8或9月2日登场
- 百度搜索框代码(有下拉提示的)
- @Validated 讲解
- 智能运动手环摄像机的作用是什么?
- 电商API接口用处以及未来的趋势
- 分享下.NET程序读取二代身份证(附源码
- Javascript获取URL地址的参数
- 虫师python appium自动化测试书_appium对博客园APP进行自动化测试
- 神器面世:快速生成你的专属卡通头像!