当我们对一个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>