Spring应用教程-3 依赖关系配置
注:组件与组件之间的耦合,采用依赖注入管理,但普通的JavaBean属性值,应直接在代码中设置。
1. 注入其他Bean的属性值
我们分析一下,Bean_A的一个属性要依赖Bean_B的一个属性值。这时应该怎么配,我们以前使用的都是通过setter方法来为Bean设置值,现在我们却要使用getter方法来获取Bean的属性值。使用我们现在的知识完全可以解决这个问题(可以先不看下面的分析,对照Spring应用教程-1的第六节:Bean的生命周期自己分析):
①Bean_A的一个属性要依赖Bean_B的一个属性值,那么我们必须首先要获取这个Bean,要获取Bean,我就要实现BeanFactoryAware接口;
②获取Bean_B的属性值,那个属性呢?这个值必须要在外面给我们说明,从Bean生命周期中我们除了发现BeanNameAware接口可以将外面的属性名给我之外,再没有其它合适的方法了。
③返回获取的Bean_B的属性值。由于我们是在Spring配置文件中配置这个信息,一般的Bean返回的是该Bean的实例,而我们现在要的是该bean的属性值 ,这就使得我们必须实现FactoryBean接口了。
我们定义这样一个实例,习大大有一个母亲,名字叫中国,我也是,我要依赖他的母亲属性的值:
public class Chinese {
}
我创建一个Chinese类,他有一个类型为China的mother。然后我们创建一个工具类,实现我们的属性值注入功能:
public class PropertyRefConfig implements BeanFactoryAware, BeanNameAware,
}
这个类配置为Bean后,在进行实例化并通过setter注入属性后,执行BeanNameAware接口方法(setBeanName),通过该方法我们拿到了该Bean的id属性,我们这里不是使用这个id属性获取该Bean的实例的,这个id已经失去了它本来的意义,我们是让它把我们要的数据(那个Bean的那个属性)给我们带进来。然后解析这个id,获取要获取那个Bean和该Bean的属性值。然后通过FactoryBean将该属性值返回。
然后我们配置Bean,使我的mother属性依赖习大大的mother属性
<bean id="china" class="smzq.China"/>
</bean>
这里我们使用了嵌套Bean,它的id属性表明,我们要取xidada的mother属性。
测试:
其实这也就是PropertyPathFactoryBean的原理,不过强大的Spring将它包装的更完美了。有了这个类,我们便可以直接使用了,不用再费神的写PropertyRefConfig了:
<bean id="china" class="smzq.China"/>
</bean>
这样配置便好了。查看PropertyPathFactoryBean我们发现,它也是继承了这3个接口:
2. 注入其他Bean的方法返回值
按照前面的例子,我们可以轻松的自己实现这个功能,这里就不再演示了(反正又没Spring写得好)直接用Spring提供的类了:
通过Spring提供的MethodInvokingFactoryBean工厂Bean便可以实现这个需求:
<bean id="china" class="smzq.China"/>
</bean>
其中:
targetObject属性表明要调用那个Bean中的方法;
targetMethod属性表明要调用那个方法。
上面我们调用的方法是实例方法,如果我们调用的是一个静态方法时,就无需使用targetObject属性了,使用targetClass属性即可。
我们都知道,Java允许方法重载,那么我们上面这样的调用遇见重载方法时是不是会出现问题呢?如果方法有参数,我们怎么传入?
我们上面这种方法实际上是调用对应方法的无参版本,如果方法有参数,则使用arguments 属性来传入:
<bean id="commonpeople" class="smzq.People">
</bean>
如果对给集合类型注入值不太熟悉的话,可以参考Spring应用教程-1的7.2节。
Spring应用教程-3 依赖关系配置的更多相关文章
- Spring框架学习之高级依赖关系配置(一)
上篇文章我们对Spring做了初步的学习,了解了基本的依赖注入思想.学会简单的配置bean.能够使用Spring容器管理我们的bean实例等.但这还只是相对较浅显的内容,本篇将介绍bean的相关更高级 ...
- Spring IOC、对象依赖关系
Spring IOC.对象依赖关系 2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...
- 微服务下 Spring Boot Maven 工程依赖关系管理
单体 Spring Boot Maven 工程 最基本的 pom.xml 包含工程信息.Spring Boot 父工程.属性配置.依赖包.构建插件 <?xml version="1.0 ...
- spring 最全MAVEN 依赖引入配置
<properties> <spring.version>4.1.6.RELEASE</spring.version> </properties> &l ...
- Spring框架学习之高级依赖关系配置(二)
紧接着上篇内容,本篇文章将主要介绍XML Schema的简化配置和使用SpEL表达式语言来优化我们的配置文件. 一.基于XML Schema的简化配置方式 从Spring2.0以来,Spring支持使 ...
- spring-第九篇之高级依赖关系配置
1.关于配置文件一些使用 组件与组件之间的耦合,采用依赖注入管理:基本类型的成员变量值,应该直接在代码中设置. 2.获取其他bean的属性值 PorpertyPathFactoryBean用来获取目标 ...
- Jenkins job之间依赖关系配置(联动构建)
使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包.比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 主要有两种方法: 1.配置上游依赖: 2.配置下游依 ...
- Jenkins-job之间依赖关系配置
使用场景: 想要在某APP打新包之后,立即执行自动化测试的job来验证该新包. 比如Job A 执行完执行Job B ,如下图所示,如何建立依赖呢? 1.配置上游依赖 构建触发器-配置如下信息: 选择 ...
- Spring IOC - 控制反转(依赖注入) - 配置初始化和销毁的方法
在Spring中如果某个bean在初始化之后,或销毁之前要做一些额外操作可以为该bean配置初始化和销毁的我方法,在这些方法中完成需要的功能. 实验: 通过断点调试模式,测试初始化方法和销毁方法的执行 ...
随机推荐
- swift语言特性
最近苹果推出了他们新的开发语言,swift,他们自己的说法是,swift语言将会更快捷,更安全等等.但是具体的性能,还需要在后面的实践过程中去观察,但是就目前来说swift语言除了将大部分21世纪静态 ...
- ORACLE基本知识
一.数据库名 什么是数据库名? 数据库名就是一个数据库的标识,就像人的身份证号一样.他用参数DB_NAME表示,如果一台机器上装了多全数据库,那么每一个数据库都有一个数据库名.在数据库安装或创建完成 ...
- 黑马程序员——File笔记读,写,复制
#region ReadAllBytes byte[] buffer = File.ReadAllBytes(@"C:\Users\dell\Desktop\新建文件夹.txt") ...
- 用nifi executescript 生成3小时间隔字符串
import java.io from datetime import datetime from org.apache.commons.io import IOUtils from java.nio ...
- 设计模式之美:Behavioral Patterns(行为型模式)
行为型模式涉及到算法和对象间职责的分配. 行为模式不仅描述对象或类的模式,还描述它们之间的通信模式. 这些模式刻划了在运行时难以跟踪的复杂的控制流.它们将你的注意力从控制流转移到对象间的联系方式上来. ...
- Entity Framework 5.0系列之Code First数据库迁移
我们知道无论是"Database First"还是"Model First"当模型发生改变了都可以通过Visual Studio设计视图进行更新,那么对于Cod ...
- 动态绑定HTML
在Web前端开发中,我们经常会遇见需要动态的将一些来自后端或者是动态拼接的HTML字符串绑定到页面DOM显示,特别是在内容管理系统(CMS:是Content Management System的缩写) ...
- 使用DBUnit框架数据库插入特殊字符失败的查错经历
本文记录的是使用DBUnit测试框架进行数据库数据插入时,插入特殊字符失败的查错经历.希望能对向我这样的小白同学们在遇到类似问题时,能够有一些启发.背景:在写跟数据库交互模块的单元测试,数据库表中的e ...
- Windows UDP socket recvfrom返回10054错误的解决办法
现象: 在Windows 7系统上,A使用UDP socket,调用sendto函数向一个目标地址B发送数据,但是目标地址B没有接收数据,如果A此时立即调用recvfrom试图接收目标地址B发回的数据 ...
- 科蓝软件急招前端开发、PHP、.NET工程师
职位:前端开发 工作年限:不限 学历要求:大专 招聘人数:2 专业:不限 薪酬:面议 工作地点:浙江嘉兴.北京 岗位职责: 1.负责公司项目的UI设计: 2.负责将UI静态化 ...