当我们对一个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 依赖注入详解的更多相关文章

  1. Spring之IOC核心模块详解

    Spring IOC简述 IOC称为控制反转,也有一种说法叫DI(依赖注入).IOC也是spring最核心的模块,Spring的所有工作几乎都围绕着IOC展开. 什么是控制反转呢?简单的说,控制反转就 ...

  2. Spring之 IOC&依赖注入

    0x01.Spring 1什么是Spring ​ Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的(解耦). ​ 框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组 ...

  3. Spring.net Ioc 依赖注入

    控制反转 (Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心. 控制反转一般分为两种类型,依赖注 ...

  4. DI:依赖注入详解

    DI(依赖注入) 依赖注入的理解: 一般写程序的时候service层都需要用到dao层,所以一般都是在service层里面new  dao ,而现在利用依赖注入的方式,直接把dao给了service层 ...

  5. spring的IOC——依赖注入的两种实现类型

    一.构造器注入: 构造器注入,即通过构造函数完成依赖关系的设定.我们看一下spring的配置文件: <constructor-arg ref="userDao4Oracle" ...

  6. spring的ioc依赖注入的三种方法(xml方式)

    常见的依赖注入方法有三种:构造函数注入.set方法注入.使用P名称空间注入数据.另外说明下注入集合属性 先来说下最常用的那个注入方法吧. 一.set方法注入 顾名思义,就是在类中提供需要注入成员的 s ...

  7. Spring 3.0 注解注入详解

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  8. Angular依赖注入详解

    Angular算是将后端开发工程化引入前端的先驱之一,而Dependency injection依赖注入(后面简称为DI)又是Angular内部运作的核心功能,所以要深入理解Angular有必要先理解 ...

  9. angularjs MVC、模块化、依赖注入详解

    一.MVC <!doctype html> <html ng-app> <head> <meta charset="utf-8"> ...

随机推荐

  1. UIScrollView的contentSize、contentOffset和contentInset属性

    IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属性,同时,U ...

  2. vue中axios发送post请求,后端(@RequestParam)接不到参数

    遇到的问题描述 :axios post 请求,后端接收不到参数. 我们的接口是java,用@RequestParam来接收前端的参数 解决方案:使用qs:axios中已经包含有qs,所以无需重新安装, ...

  3. BZOJ 2406 LuoguP4194 矩阵 有上下界可行流

    分析: 这道题乍一看……卧槽这都什么玩意…… 然后发现给了个A矩阵,要求一个可行的B矩阵,使得矩阵C=A-B的每一行的和的绝对值和每一列的和的绝对值的最大值最小…… 好拗口啊…… 什么最大值最小之类的 ...

  4. JS 根据参数是否为空进行true|false判断呢

    <form id="actForm" action="${ctx}/meeting/vip/saveMeetingAttendVipAct" method ...

  5. windows开启远程

    windows开启远程桌面超级简单,跟linux相比太简单了. 补充:有瑕疵,应该是远程中的远程桌面属性打钩,但是W8.1没有这个选项,W7可以,其次创建一个管理员账户,身份是管理员,不是标准用户,要 ...

  6. [bzoj2443][Usaco2011 Open]奇数度数_树形dp_生成树_并查集

    奇数度数 bzoj-2443 Usaco-2011 Open 题目大意:给定一个n个点m条便有向图,问是否有一种选出一些边的方式使得所有点的度数都是奇数. 注释:$1\le n \le 5\cdot ...

  7. HTML学习之Flex 布局

    一.Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性. 任何一个容器都可以指定为 Flex 布局. .box ...

  8. MongoDB小结21 - find【游标】

    数据库使用游标来控制find的执行结果. 客户端对游标的实现通常能够对最终结果进行有效控制. 可以限制结果的数量,略过部分结果,对任意方向任意键的组合对结果进行排序,或者去执行一些功能强大的操作. 我 ...

  9. [转] ASPNET Core 中获取应用程序物理路径

    如果要得到传统的ASP.Net应用程序中的相对路径或虚拟路径对应的服务器物理路径,只需要使用使用Server.MapPath()方法来取得Asp.Net根目录的物理路径,如下所示: // Classi ...

  10. SGU 439 A Secret Book

    解法: 对于第二个串,循环移动能得到的字典序最小的串,可以直接用最小表示法搞定. 然后用最小表示的第二个串和第一个串做两次扩展KMP,一次正常求,另外一次将两个串都反转一下,然后扫一遍ex[]数组 # ...