热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

spring里面的bean是怎么注入的,spring装配bean的方法有哪些

原理理解:spring自动注入对象是通过创建一个BeanFactory并传入applicationContext配置文件对象,然后调用BeanFactory的getBean方法来实

框架:spring+struts2
spring负责对象管理,MVC;自动装配由struts2完成 (bean定义+getter/setter方法);

项目中用到了通过反射途径调用相应的业务模块的逻辑。controller接收http请求后,根据请求参数获得业务代码和方法参数,到.xml配置文件中读取相应的类名,方法名,参数类型列表,调用ReflectASM.jar(高效反射工具)中的

public static Object AsmMethodRefUtil.invokeAsmFunc(String className, String methodName, Object[] paramValues, Class[] paramTypes);

方法。该工具根据类名生成相应的对象,调用方法,传入参数列表并返回所调用的方法返回值。

我的问题是:需要在反射生成的对象中注入一个spring bean定义的对象,然而被注入的容器类本身不是spring bean组件,怎么办?

原理理解:
spring自动注入对象是通过创建一个BeanFactory并传入applicationContext配置文件对象,然后调用BeanFactory的getBean方法来实现相互依赖的对象获取和装配的。如果被注入的容器没有在spring bean中配置,而是通过反射途径生成,不能获取BeanFactory,就意味着不能进行自动注入。
如果在组件上实现一些spring提供的接口,如BeanFactoryAware、ApplicationContextAware,就可以手动方式获取BeanFactory,实现依赖注入。

在两个网页找到了共3种方法。

https://my.oschina.net/zhukp/blog/170855

http://www.cnblogs.com/Johness/archive/2012/12/25/2833010.html

我使用了第一个网页的第一种方法。

被注入的容器类需要extends BaseAutoAware。因为我的组件已经继承一个父类,我把其中的代码移植到了组件继承的父类中。

public class BaseWebService { public BaseSfqxWebService() { ((AutowireCapableBeanFactory)retrieveBeanFactory()) .autowireBeanProperties(this, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, true); }private BeanFactory retrieveBeanFactory() { BaseLocator bl=new BaseLocator(); BeanFactory f = bl.getFactory(); return f;}}

BaseLocator类,实现BeanFactoryAware接口,获取BeanFactory对象:
(需要spring-beans-XXX.jar)

public class BaseLocator implements BeanFactoryAware {private static BeanFactory factory = null; private static BaseLocator baselocator = null;@Override public void setBeanFactory(BeanFactory f) throws BeansException { factory = f; } public BeanFactory getFactory(){ return factory; } public static BaseLocator getInstance() { if (baselocator == null) baselocator = (BaseLocator) factory.getBean("baseLocator"); return baselocator; } }

在spring bean里做个配置

其中getInstance()方法作者大约是漏掉了,所以一开始出现了组件父类中retrieveBeanFactory()方法返回BeanFactory为null的情况,搜索后终于找到原因,于是加上。

被注入的容器子类采用getter/setter方法注入。

public class MyLoginWebService extends BaseWebService {private IUserService userService;public MyLoginWebService() {super();System.out.println(userService);}public IUserService getUserService() {return userService;}public void setUserService(IUserService userService) {this.userService = userService;} }

获取到的userService终于不为null了。

成功。

源码: 码云


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • YOLOv7基于自己的数据集从零构建模型完整训练、推理计算超详细教程
    本文介绍了关于人工智能、神经网络和深度学习的知识点,并提供了YOLOv7基于自己的数据集从零构建模型完整训练、推理计算的详细教程。文章还提到了郑州最低生活保障的话题。对于从事目标检测任务的人来说,YOLO是一个熟悉的模型。文章还提到了yolov4和yolov6的相关内容,以及选择模型的优化思路。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • PHP中的单例模式与静态变量的区别及使用方法
    本文介绍了PHP中的单例模式与静态变量的区别及使用方法。在PHP中,静态变量的存活周期仅仅是每次PHP的会话周期,与Java、C++不同。静态变量在PHP中的作用域仅限于当前文件内,在函数或类中可以传递变量。本文还通过示例代码解释了静态变量在函数和类中的使用方法,并说明了静态变量的生命周期与结构体的生命周期相关联。同时,本文还介绍了静态变量在类中的使用方法,并通过示例代码展示了如何在类中使用静态变量。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
author-avatar
jxxpoo
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有