spring 之 IOC 依赖注入详解
当我们对一个javaBean进行实例化时,在原本的情况下我们会选择新建一个接口,然后进行实例化,为了进一步降低耦合度我们还会使用工厂模式进行封装。
例:
当我们想要去造,Chinese、American 时,我们会先去建造接口Human 在用Chinese American 来实现Human接口,同时建立HumanFactoy 在需要对象时 我们可以通过调用HumanFactory 来完成。
简单点来说我们可以这样去实现:
public Human getHuman(String human){
if (human.equals("Chinese")) {
return new Chinese();
}else if (human.equals("American")) {
return new American()
}
}
之后 我们的 Human 应该可以 speak() ,所以我们的Chinese和American相应的也应该具有属性 Language .
接下来理所应当的去构建 getter/setter() 方法 或者 在构造方法里加入 this.language = language 然后在使用时手动调用相应的方法进行初始化。
在这里Spring 给我们提供了另外一种创建对象的方法。
例:
我们用 spring 的相关配置代替了HumanFactory 来创建对象, 并且我们无需调用Human的相关方法, 只需要在相关文件进行配置,将Human跟Language之间的关系交又外部文件来完成,而不是去调用Human的方法,手动去初始化 Language。
javaBean 不变。
public interface Human {
public void speak();
}
import com.language.Language;
public class Chinese implements Human{
private Language lan1;
private Language lan2;
@Override
public void speak() {
System.out.println("中国人说:"+lan1.kind());
System.out.println("中国人也说:"+ lan2.kind());
} public void setLan1(Language lan1) {
this.lan1 = lan1;
} public void setLan2(Language lan2) {
this.lan2 = lan2;
}
}
public interface Language {
public String kind();
}
public class English implements Language{
@Override
public String kind() {
return "英语";
}
}
public class Chinese implements Language{
@Override
public String kind() {
return "中文";
}
}
在我们导入相关spring组件时会在src下自动创建 applicationContext.xml 我们在此做相关部署,将中国人跟中文、英文分别配置,并且设置 lan1为 中文 lan2 为 英文。
如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
<!-- 注入chinese对象 -->
<bean id="Chinese" class="com.human.Chinese">
<!-- property 元素用来指定需要容器注入的属性,lan属性需要容器注入 -->
<property name="lan1" ref="chinese"></property>
<property name="lan2" ref="english"></property>
</bean>
<!-- 注入English对象 -->
<bean id="english" class="com.language.English"></bean>
<!-- 注入chinese对象 -->
<bean id="chinese" class="com.language.Chinese"></bean>
</beans>
测试代码如下:
public class Test {
public static void main(String[] args) {
ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/applicationContext.xml");
Human human = null;
human = (Human)ctx.getBean("Chinese");//依赖注入获取"chinese"
human.speak();
}
}
运行结果:
中国人说:中文
中国人也说:英语
以上所使用的方法为设置注入,在xml文件中设置好了属性值。(主要使用方法)
利用构造函数来设置依赖注入的方式为,构造注入,,这种方法在构造实例时,就已经为其完成属性的初始化。
如次只需要对前面的Chinesse进行修改,不再需要属性的setter()方法。而改为初始化属性的构造函数
public Chinese(Language lan1, Language lan2) {
super();
this.lan1 = lan1;
this.lan2 = lan2;
}
配置文件也做简单修改:
<?xml version="1.0" encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd"> <bean id="Chinese" class="com.human.Chinese">
<!-- property 元素用来指定需要容器注入的属性,lan属性需要容器注入 -->
<constructor-arg ref="chinese"></constructor-arg>
<constructor-arg ref="english"></constructor-arg>
</bean> <!-- 注入English对象 -->
<bean id="english" class="com.language.English"></bean>
<!-- 注入chinese对象 -->
<bean id="chinese" class="com.language.Chinese"></bean>
</beans>
spring 之 IOC 依赖注入详解的更多相关文章
- Spring之IOC核心模块详解
Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...
- Spring之 IOC&依赖注入
0x01.Spring 1什么是Spring Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...
- Spring.net Ioc 依赖注入
控制反转 (Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注 ...
- DI:依赖注入详解
DI(依赖注入) 依赖注入的理解: 一般写程序的时候service层都需要用到dao层,所以一般都是在service层里面new dao ,而现在利用依赖注入的方式,直接把dao给了service层 ...
- spring的IOC——依赖注入的两种实现类型
一.构造器注入: 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <constructor-arg ref="userDao4Oracle" ...
- spring的ioc依赖注入的三种方法(xml方式)
常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...
- Spring 3.0 注解注入详解
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- Angular依赖注入详解
Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...
- angularjs MVC、模块化、依赖注入详解
一.MVC <!doctype html> <html ng-app> <head> <meta charset="utf-8"> ...
随机推荐
- vue 改变插值方法
Vue默认的插值是双大括号{{}}.但有时我们会有需求更改这个插值的形式. delimiters:['${','}'] //必须要用一个数组来接收,用逗号隔开.
- 远程连接mysql数据库
远程连接mysql数据库需要以下步骤(改表法): 1.数据源(数据库服务器)对要访问数据库进行授权: 2.本地库(本地)连接: 具体方法: 1. 进入数据服务器,输入cmd进入控制台:输入 mysql ...
- PHP:Mysql 基础类
文章来源:http://www.cnblogs.com/hello-tl/p/7592547.html <?php /** * __construct($Mysql_config) 构造函数 $ ...
- Mac使用Aria2下载百度网盘,突破下载限速的方法教程
百度网盘目前可以说是在国内网盘环境中一枝独秀,日常使用触及在所难免,尤其是对于喜欢下载资源的朋友来说,但是一些限制让它的使用越来越难,尤其是下载速度,普通用户的下载往往远低于自己的预期,特别是对于 M ...
- MySQL-----用户和授权管理
用户管理: 创建用户: create user '用户名'@'用户pc的ip地址(ip可以写精准点的,也可以是网段的,也可以写一个‘’%‘’提所有)' identified(设置密码) by '密码 ...
- 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)
读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...
- Leetcode 220.存在重复元素III
存在重复元素III 给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. ...
- 九度oj 题目1063:整数和
题目1063:整数和 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4043 解决:2638 题目描述: 编写程序,读入一个整数N.若N为非负数,则计算N到2N之间的整数和:若N为一个负数 ...
- JavaEE JDBC 核心API
JDBC接口核心的API @author ixenos java.sql.* 和 javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口 ...
- 【51NOD1806】wangyurzee的树(Prufer编码,容斥原理,组合计数)
题意:有n个点和m条限制,每条限制限制了一个点的度数不能为某个数. 求合法的树的个数模10^9+7 n<=10^6 m<=17 思路:WYZ作业 首先m<=17显然是2^m容斥 枚举 ...