依赖注入(DI)

1.构造器注入

就是通过有参构造器注入,在前面的helloSpring中已经实现过了构造器注入

  1. 下标赋值
    <!--第一种方式,通过下标复赋值-->
    <bean id="User" class="com.zhaox.pojo.User">
       <constructor-arg index="0" value="zhaox"/>
    </bean>
    
  2. 类型
    <!--第二种方式,通过类型创建,不建议使用-->
    <bean id="User" class="com.zhaox.pojo.User">
       <constructor-arg type="java.lang.String" value="zhaox"/>
    </bean>
    
  3. 参数名
    <!--第三种方式,直接通过参数名设置-->
    <bean id="User" class="com.zhaox.pojo.User">
       <constructor-arg name="name" value="zhaox"/>
    </bean>
    

User的实例化是在bean的创建时完成的!

2.Set方式注入

  • 环境搭建:先构建pojo,beans.xml,还有测试类
    • pojo

    • 复杂类型:

      private String address;
      public String getAddress() {
        return address;
      }
      public void setAddress(String address) {
        this.address = address;
      }
      
      public class Student {
        private String name;
        private Address address;
        private String[] books;
        private List<String> hobbys;
        private Map<String,String> card;
        private Set<String> games;
        private Properties info;
        private String wife;
      }
      
    • xml文件

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--第一种,普通值注入,直接使用value-->
        <bean id="student" class="com.zhax.pojo.Student">
            <property name="name" value="zhaox"/>
        </bean>
    </beans>
    
    • 测试类
    public class MyTest {
        public static void main(String[] args) {
            ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
            Student student = (Student)context.getBean("student");
            System.out.printf(student.getName());
        }
    }
    

完善的注入信息:

<bean id="student" class="com.zhax.pojo.Student">
    <!--第一种,普通值注入,直接使用value-->
    <property name="name" value="zhaox"/>
    <!--第二种bean注入,ref-->
    <property name="address" ref="address"/>
    <!--数组注入,ref-->
    <property name="books">
        <array>
            <value>三国演义</value>
            <value>水浒传</value>
            <value>西游记</value>
            <value>红楼梦</value>
        </array>
    </property>
    <!--List注入-->
    <property name="hobbys">
        <list>
            <value>听音乐</value>
            <value>打游戏</value>
            <value>敲代码</value>
        </list>
    </property>
    <!--mao注入-->
    <property name="card">
        <map>
            <entry key="身份证" value="12356"/>
            <entry key="学生证" value="12121212121"/>
            <entry key="银行卡" value="12315135"/>
        </map>
    </property>
    <!--Set注入-->
    <property name="games">
        <set>
            <value>使命召唤</value>
            <value>我的世界</value>
            <value>COC</value>
        </set>
    </property>
    <!--空值注入-->
    <property name="wife">
        <null/>
    </property>
    <!--properties注入-->
    <property name="info">
        <props>
            <prop key="学号">1718020221</prop>
            <prop key="班级">软工171</prop>
        </props>
    </property>
</bean>

3.拓展方式注入

可以通过两种不同的标签进行注入

3.1P命名空间

在xml文件加入P标签

xmlns:p="http://www.springframework.org/schema/p"
<!--P命名空间注入,通过Set方法注入-->
<bean id="user" class="com.zhax.pojo.User" p:name="zhaox" p:age="18"/>

3.2C命名空间

在xml文件加入C标签

xmlns:c="http://www.springframework.org/schema/c"
<!--C命名空间注入,通过构造器注入-->
<bean id="user2" class="com.zhax.pojo.User" c:age="18" c:name="狂神"

p命名空间就是通过Set方法注入

C命名空间就是通过构造器注入

两者都简化了我们的操作,可以直接通过一个标签解决问题


醉后不知天在水,满船清梦压星河