Spring 学习(二) 依赖注入(DI)

1. 概念理解

  • 依赖:bean 对象的创建依赖于容器

    • Class class = new Class() 这个过程交给 IOC 容器完成,我们只需要配置 .xml 文件即可。
  • 注入:bean 对象的所有属性由容器注入

    • class.value = ××× 这个过程也由 IOC 容器完成,我们也仅配置 .xml 文件就可以了。

2. 基于构造函数的依赖注入

  • 模板类

    package examples;
    
    public class ExampleBean {
        
        //成员属性
        private int years;
        private String ultimateAnswer;
        
        //无参构造函数
        public ExampleBean(int years, String ultimateAnswer) {}
        //有参构造函数
        public ExampleBean(int years, String ultimateAnswer) {
            this.years = years;
            this.ultimateAnswer = ultimateAnswer;
        }
    }
    
  • IOC 默认使用无参构造函数创建对象,若无无参构造函数,则会报错。

    <bean id="exampleBean" class="examples.ExampleBean"/>
    
  • 使用 <constructor-arg /> 标签显式调用构造函数创建对象。

    • 使用 index 属性可以显式指定构造函数参数的索引。

      <bean id="exampleBean" class="examples.ExampleBean">
          <constructor-arg index="0" value="7500000"/>
          <constructor-arg index="1" value="42"/>
      </bean>
      
    • 若参数类型唯一,可使用 type 属性显式指定构造函数参数的类型。

      <bean id="exampleBean" class="examples.ExampleBean">
          <constructor-arg type="int" value="7500000"/>
          <constructor-arg type="java.lang.String" value="42"/>
      </bean>
      
    • 最常使用的是 name 属性指定构造函数参数名称来消除歧义。

      <bean id="exampleBean" class="examples.ExampleBean">
          <constructor-arg name="years" value="7500000"/>
          <constructor-arg name="ultimateAnswer" value="42"/>
      </bean>
      
  • 对象是 .xml 文件(配置文件)加载时创建的。如果一个类在 .xml 文件中注册了,无论程序是否调用它,它的对象都已经创建并存在了。

3. 基于 Setter 的依赖注入

  • 模板类

    package com.why.pojo;
    
    /**
     * TODO
     *实体类
     * @author why
     * @since 2021/4/8 18:09
     */
    public class Student {
        
        private int id;
        private int age;
        private String name;
        //自定义类型
        private School school;
        private String[] books;
        private List<String> hobbies;
        private Map<String, String> card;
        private Set<String> games;
        private String wife;
        private Properties info;
        
        //所有属性的 set 方法都要实现
        public void setName(String name) {
            this.name = name;
        }
        ...
    }
    
    package com.why.pojo;
    
    /**
     * TODO
     * 自定义引用类
     * @author why
     * @since 2021/4/8 18:08
     */
    public class School {
    
        private String name;
    
        public School() { }
        public School(String name) {
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
    
  • .xml 文件的配置(依赖注入)

    <bean id="school" class="com.why.pojo.School">
        <property name="name" value="加里敦大学"/>
    </bean>
    
    <bean id="student" class="com.why.pojo.Student">
        
        <!--普通值-->
        <property name="name" value="Why"/>
        
        <!--Bean 引用值-->
        <property name="school" ref="school"/>
        
        <!--数组-->
        <property name="books">
            <array>
                <value>呐喊</value>
                <value>彷徨</value>
                <value>朝花夕拾</value>
            </array>
        </property>
        
        <!--List-->
        <property name="hobbies">
            <list>
                <value></value>
                <value></value>
                <value>rap</value>
                <value>篮球</value>
            </list>
        </property>
        
        <!--Map-->
        <property name="card">
            <map>
                <entry key="学生卡" value="171201211"/>
                <entry key="身份证" value="123456789"/>
            </map>
        </property>
        
        <!--Set-->
        <property name="games">
            <set>
                <value>元气骑士</value>
                <value>炉石传说</value>
            </set>
        </property>
        
        <!--NULL-->
        <property name="wife">
            <null/>
        </property>
        
        <!--Properties-->
        <property name="info">
            <props>
                <prop key="性别"></prop>
                <prop key="身高">170CM</prop>
            </props>
        </property>
    
    </bean>
    

4. 其他方式的依赖注入

  • p 命名空间

    • 可直接注入属性值。

    • 本质是 <property/> 标签的运用,也就是基于 setter 依赖注入的扩展。

    • 导入 xml 约束。

      xmlns:p="http://www.springframework.org/schema/p"
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YMhFc9uY-1625457435160)(Spring.assets/p命名空间xml约束.jpg)]

    • 依赖注入

      <bean id="student" class="com.why.pojo.Student" p:id="1">
          ...
      </bean>
      
  • c 命名空间

    • 可直接注入属性值

    • 本质是 <constructor-arg/> 标签的运用,也就是基于构造函数依赖注入的扩展。

    • 导入 xml 约束

      xmlns:c="http://www.springframework.org/schema/c"
      

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lnfQiEg7-1625457435163)(Spring.assets/c命名空间xml约束.jpg)]

    • 创建要注入依赖的属性的有参构造函数(有且仅有此参数)。

      public Student(int age) {
          this.age = age;
      }
      
    • 依赖注入

      <bean id="student" class="com.why.pojo.Student" c:age="18">
          ...
      </bean>
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值