孙哥讲解spring5------------day4&day5

第四章、注入(Injection)

1. 什么是注入

通过Spring工厂和配置文件,为创建对象的成员变量赋值
1.1 为什么需要注入

1631201585304

1.2如何进行注入[开发步骤]
  • 类为成员变量提供get set方法

  • 在配置文件中配置相关属性

    <bean id = "person" class="xxx.xxx.Person">
    	<property name="id">
        	<value>1</value>
    	</property>
        <property name="name">
        	<value>liuqiang</value>
    	</property>
    </bean>
    
1.3 注入的好处

解耦合

2. Spring注入原理分析(简易版)

  1. 通过ClassPathXmlApplication工厂读取配置文件

  2. getBean()方法获取配置文件中的bean标签的相关信息

  3. 使用反射针对bean标签中class属性 来创建class的实例化对象

Class clazz = Class.forName("class的全限定名")

  1. 反射创建对象 底层逻辑也是调用自己的构造方法

id值 = clazz.newInstance(); <====> Person person = new Person();

  1. 之后 也是底层去调用对象的set方法 去对成员变量进行赋值,这就是set注入。

1631333144554

第五章、set注入详解

针对不同类型的成员变量,在<property>标签,需要嵌套其他的标签

1631333451518

1. JDK内置类型

1.1 String + 8种基本数据类型
<value>liuqiang</value>
1.2 数组类型
<list>
    <value>liuqiang@163.com</value>
    <value>rbwbear@163.com</value>
</list>
1.3 Set集合(set的特性:无序,且不可重复)
 <set>
     <value>北京</value>
     <value>山西</value>
     <value>山西</value>
     <value>山西</value>
</set>

<set>
	<ref bean=""
     <set>
</set>
1.4 List集合(List集合的特性:可重复,有序)
<list>
    <value>131111111</value>
    <value>131111444</value>
    <value>123222222</value>
    <value>123222222</value>
</list>

<list>
	<ref bean=""
	<list>
    <set></set>
</list>
1.5 Map集合
注意: map--entry -- key 有特定的标签 <key></key> 但具体数据类型的标签根据实际情况做相应的改变
		value也是
<map>
    <entry>
        <key><value>1</value></key>
        <value>123123123</value>
    </entry>
    <entry>
        <key><value>2</value></key>
        <value>123123</value>
    </entry>
</map>
1.6 Properties类型
Properties 是特殊的Map类型,key和value都是String类型
<props>
    <prop key="prop1">value1</prop>
    <prop key="prop2">value2</prop>
</props>
1.7 其他复杂类型(Date)
需要自定义类型转换器去实现,处理。

2. 用户自定义类型

2.1 第一种方式
  • 首先必须给成员变量提供get set方法

  • 在配置文件中为成员变量赋值

    1631338052641

2.2 第二种方式
  • 第一种赋值方式的缺点

    1. 配置文件中存在代码的冗余
    2. 被注入的UserDao对象被多次创建,比较消耗JVM的内存资源
    
  • 还是首先为成员变量提供get set方法

  • 在配置文件中为成员变量赋值(赋值方式变为引用)

1631338249562

3. Set注入的简化写法(使用简化写法,其实上面所用的格式过一遍就可以了)

3.1 基于属性简化(bean标签还是存在的)

1631338782992

3.2 基于p命名空间简化(只有bean标签)

1631339317765

第六章、构造注入

注入:通过spring的配置文件,为成员变量赋值
Set注入:Spring调用Set方法,通过配置文件 为成员变量赋值
构造注入:Spring调用构造方法 通过配置文件 为成员变量赋值

1. 开发步骤

  • 提供有参构造方法

    public class Customer implements Serializable {
        private String name;
        private int age;
    
        @Override
        public String toString() {
            return "Customer{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    
        public Customer(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    
  • Spring 的配置文件

    <bean id="customer" class="com.practice.spring.pojo.Customer">
        <constructor-arg>
            <value>liuqiang</value>
        </constructor-arg>
        <constructor-arg>
            <value>19</value>
        </constructor-arg>
    </bean> 
    

2. 构造方法重载

2.1 构造参数个数不同时
通过控制参数<constructor-arg>标签的数量来区分
2.2 构造参数个数相同时
通过在标签中引入 type属性<constructor-arg type=""> 来区分

3.注入的总结

Q: 在实战中,应用set注入还是构造注入?
A: Set注入多一点
	1. 构造注入太过麻烦(重载)
	2. Spring框架底层 大量应用了set注入

1631341092273

posted @ 2021-09-11 14:24  lq-12040  阅读(56)  评论(0)    收藏  举报