spring 之 IOC 依赖注入详解

当我们对一个javaBean进行实例化时,在原本的情况下我们会选择新建一个接口,然后进行实例化,为了进一步降低耦合度我们还会使用工厂模式进行封装。

例:

当我们想要去造,Chinese、American 时,我们会先去建造接口Human 在用Chinese American  来实现Human接口,同时建立HumanFactoy  在需要对象时 我们可以通过调用HumanFactory 来完成。

简单点来说我们可以这样去实现:

1 public    Human getHuman(String human){
2     if (human.equals("Chinese")) {
3         return new Chinese();
4     }else if (human.equals("American")) {
5         return new American()
6     } 
7     
8 }

之后 我们的  Human  应该可以  speak()   ,所以我们的Chinese和American相应的也应该具有属性  Language  .

接下来理所应当的去构建    getter/setter()     方法  或者  在构造方法里加入 this.language =  language    然后在使用时手动调用相应的方法进行初始化。 

在这里Spring 给我们提供了另外一种创建对象的方法。

例:

我们用  spring  的相关配置代替了HumanFactory 来创建对象, 并且我们无需调用Human的相关方法, 只需要在相关文件进行配置,将Human跟Language之间的关系交又外部文件来完成,而不是去调用Human的方法,手动去初始化 Language。

javaBean 不变。

1 public interface Human {
2 public void speak();
3 }
 1 import com.language.Language;
 2 public class Chinese implements Human{
 3 private Language lan1;
 4 private Language lan2;
 5     @Override
 6     public void speak() {
 7         System.out.println("中国人说:"+lan1.kind());
 8         System.out.println("中国人也说:"+ lan2.kind());
 9     }
10 
11     public void setLan1(Language lan1) {
12         this.lan1 = lan1;
13     }
14 
15     public void setLan2(Language lan2) {
16         this.lan2 = lan2;
17     }
18 }
1 public interface Language {
2 public String kind();
3 }
1 public class English implements Language{
2 
3     @Override
4     public String kind() {
5         return "英语";
6     }
7 
8 }
1 public class Chinese implements Language{
2     @Override
3     public String kind() {
4         return "中文";
5     }
6 }

在我们导入相关spring组件时会在src下自动创建     applicationContext.xml  我们在此做相关部署,将中国人跟中文、英文分别配置,并且设置 lan1为 中文 lan2 为 英文。

如下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
 7     <!-- 注入chinese对象 -->
 8     <bean id="Chinese" class="com.human.Chinese">
 9     <!-- property 元素用来指定需要容器注入的属性,lan属性需要容器注入 -->
10         <property name="lan1" ref="chinese"></property>
11         <property name="lan2" ref="english"></property>
12     </bean>
13     <!-- 注入English对象 -->
14     <bean id="english" class="com.language.English"></bean>
15     <!-- 注入chinese对象 -->
16     <bean id="chinese" class="com.language.Chinese"></bean>
17 </beans>

 测试代码如下:

1 public class Test {
2     public static void main(String[] args) {
3         
4     ApplicationContext ctx = new FileSystemXmlApplicationContext("/src/applicationContext.xml");
5      Human human = null;
6      human = (Human)ctx.getBean("Chinese");//依赖注入获取"chinese"
7      human.speak();
8     }
9 }

运行结果:

中国人说:中文
中国人也说:英语

以上所使用的方法为设置注入,在xml文件中设置好了属性值。(主要使用方法)

利用构造函数来设置依赖注入的方式为,构造注入,,这种方法在构造实例时,就已经为其完成属性的初始化。

如次只需要对前面的Chinesse进行修改,不再需要属性的setter()方法。而改为初始化属性的构造函数

1 public Chinese(Language lan1, Language lan2) {
2         super();
3         this.lan1 = lan1;
4         this.lan2 = lan2;
5     }

配置文件也做简单修改:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans
 3     xmlns="http://www.springframework.org/schema/beans"
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 5     xmlns:p="http://www.springframework.org/schema/p"
 6     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
 7 
 8     
 9     <bean id="Chinese" class="com.human.Chinese">
10     <!-- property 元素用来指定需要容器注入的属性,lan属性需要容器注入 -->    
11     <constructor-arg ref="chinese"></constructor-arg>
12     <constructor-arg ref="english"></constructor-arg>
13     </bean>
14     
15     
16     <!-- 注入English对象 -->
17     <bean id="english" class="com.language.English"></bean>
18     <!-- 注入chinese对象 -->
19     <bean id="chinese" class="com.language.Chinese"></bean>
20 </beans>
原文地址:https://www.cnblogs.com/the-wang/p/7662280.html