孙哥讲解spring5------------day4&day5
第四章、注入(Injection)
1. 什么是注入
通过Spring工厂和配置文件,为创建对象的成员变量赋值
1.1 为什么需要注入

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注入原理分析(简易版)
通过ClassPathXmlApplication工厂读取配置文件
getBean()方法获取配置文件中的bean标签的相关信息
使用反射针对bean标签中class属性 来创建class的实例化对象
Class clazz = Class.forName("class的全限定名")
- 反射创建对象 底层逻辑也是调用自己的构造方法
id值 = clazz.newInstance(); <====> Person person = new Person();
- 之后 也是底层去调用对象的set方法 去对成员变量进行赋值,这就是set注入。
第五章、set注入详解
针对不同类型的成员变量,在<property>标签,需要嵌套其他的标签

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方法
-
在配置文件中为成员变量赋值

2.2 第二种方式
-
第一种赋值方式的缺点
1. 配置文件中存在代码的冗余 2. 被注入的UserDao对象被多次创建,比较消耗JVM的内存资源 -
还是首先为成员变量提供get set方法
-
在配置文件中为成员变量赋值(赋值方式变为引用)

3. Set注入的简化写法(使用简化写法,其实上面所用的格式过一遍就可以了)
3.1 基于属性简化(bean标签还是存在的)

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

第六章、构造注入
注入:通过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注入


浙公网安备 33010602011771号