3.1 代码 peak mxml 手动 初始化 org contex thum
当我们对一个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 依赖注入详解
来源: http://www.bubuko.com/infodetail-2349855.html