• 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>
  • 相关阅读:
    第38章 刷新令牌
    第37章 资源所有者密码验证(Resource Owner Password Validation)
    第36章 扩展授权
    第35章 秘密(secrets)
    第34章 授予类型
    node.js+ react + redux 环境搭建
    资源整理
    django form 组件插件
    django cookies与session
    django 初始命令
  • 原文地址:https://www.cnblogs.com/the-wang/p/7662280.html
Copyright © 2020-2023  润新知