Version: Next

DI依赖注入

1. 构造器注入

第四节说过了

2. Set注入[重点]

  • 依赖:bean对象的创建依赖容器
  • 注入:bean对象中的所有属性由容器来注入

2.1 环境搭建

新建一个maven模块,spring04

  1. 复杂类型

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbies;
    private Map<String,String> cards;
    private Set<String> games;
    private String wife;
    private Properties info;
    }
  1. beans.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">
    <bean id="address" class="com.bsx.pojo.Address">
    <property name="address" value="我家地址"/>
    </bean>
    <bean id="student" class="com.bsx.pojo.Student">
    <!-- 普通值注入-->
    <property name="name" value="我有名字了"/>
    <!-- Bean注入 ref-->
    <property name="address" ref="address"/>
    <!-- 数组注入-->
    <property name="books">
    <array>
    <value>红楼梦</value>
    <value>西游记</value>
    <value>水浒传</value>
    <value>三国演义</value>
    </array>
    </property>
    <!-- List注入-->
    <property name="hobbies">
    <list>
    <value></value>
    <value></value>
    <value></value>
    </list>
    </property>
    <!-- Map注入-->
    <property name="cards">
    <map>
    <entry key="身份证" value="11111"/>
    <entry key="银行卡" value="6227"/>
    </map>
    </property>
    <!-- Set注入-->
    <property name="games">
    <set>
    <value>魔兽</value>
    <value>吃鸡</value>
    <value>LOL</value>
    </set>
    </property>
    <!-- 值为null的字符串-->
    <property name="wife">
    <null/>
    </property>
    <!-- Properties注入-->
    <property name="info">
    <props>
    <prop key="学号">20190000</prop>
    <prop key="性别">male</prop>
    </props>
    </property>
    </bean>
    </beans>
  2. 结果

    Student(name=我有名字了, address=Address(address=我家地址), books=[红楼梦, 西游记, 水浒传, 三国演义], hobbies=[吃, 喝, 睡], cards={身份证=11111, 银行卡=6227}, games=[魔兽, 吃鸡, LOL], wife=null, info={学号=20190000, 性别=male})

3. 拓展方式注入

注意:使用它们需要导入相应的xml约束,去官方文档找

3.1 p命名空间

用来简化<property>标签

  • 新建User类

    @Data
    public class User {
    private String name;
    private int age;
    }
  • userbeans.xml

    <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
    https://www.springframework.org/schema/beans/spring-beans.xsd">
    <!-- p命名空间,可以直接注入属性-->
    <bean id="user" class="com.bsx.pojo.User" p:name="我的名字" p:age="18"/>
    </beans>
  • 测试与结果

    @Test
    public void testUser() {
    ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
    User user = context.getBean("user", User.class);
    System.out.println(user);
    }
    User(name=我的名字, age=18)

3.2 c命名空间

对应构造器注入,简化。

  • userbeans.xml

    <!-- 命名空间,可以简化构造器注入-->
    <bean id="user2" class="com.bsx.pojo.User" c:name="构造方法注入名字" c:age="18"/>
  • 测试与结果

    @Test
    public void testUser2() {
    ApplicationContext context = new ClassPathXmlApplicationContext("userbeans.xml");
    User user = context.getBean("user2", User.class);
    System.out.println(user);
    }
    User(name=构造方法注入名字, age=18)

4. bean的作用域


4.1 单例模式(Spring默认)

容器里的对象是单例 singleton

<bean id="user1" class="com.bsx.pojo.User" p:name="我的名字" p:age="18" scope="singleton"/>

4.2 原型模式

容器里的每一个bean都创建一个新对象 prototype

<bean id="user" class="com.bsx.pojo.User" p:name="我的名字" p:age="18" scope="prototype"/>

4.3 其他作用域

  • Request:每一次HTTP请求都会产生一个新的bean,该bean尽在当前HTTP request中有效
  • session:每一次HTTP请求都会产生一个新的bean,该bean只在当前HTTP的session中有效
  • global-session:Spring 5已经没了
info

request、session、application、websocket只在web开发中使用