前言
在学习spring的时候有个很重的知识点,那就是注入,不同的注入方式为程序的运行效率,资源利用都有不同的好处,接下来就看看我通过看视频总结的注入。
一、引入注入
1.首先我们明确一个问题,什么注入?
通过spring工厂及配置文件,为所创建对象的成员变量赋值。
我们在没有学习spring之前创建对象是通过在类里利用new关键进行创建,这样的方式大家都知道,耦合性比较高,不提倡这样做,但是在我们学习spring之后就知道了,在spring框架提供工厂,对程序员来说带来了很大的便利;
所以在这里,所谓注入就是通Spring工厂及配置文件,为所创建的对象的成员变量赋值。说白了就是对一个对象进行初始化,也就是省去了new这个步骤,类似工厂一样,让工厂去造对象。
2.为什么要注入?
通过编码的方式,为成员变量赋值,这样存在耦合。
3.如何进行注入
类为成员变量提供get和set方法
配置spring的配置文件
通过这两步就完成了注入。
4.注入的好处: 最根本的就是解耦合,从上述代码中能看出,把创建对象的任务交给了工厂,减少了依赖。
Spring注入原理分析
首先,要明确一个很重要的点:对于spring来说,它操作的是配置文件,它会把配置文件翻译成代码。
最开始它先读取bean标签中的account,通过account去读取class=xxxx,用来创建对象,其实就是底层的反射实现的,等效于调用构造函数。
- bean标签等效于对象的创建
- properties等效于调用属性的set方法来完成赋值。
spring通过底层调用独享属性对应的set方法,完成成员变量的赋值,这种方式我们称之为set注入。
二、注入方式
set注入
针对于不同类型的成员变量,在<properties>中注入
1.JDK内置类型
1.1Spring+8种基本类型
<value>yangyp</value>
1.2数组
<list>
<value>zhangsan@163.com</value>
<value>lisi@163.com</value>
<value>wangwu@163.com</value>
<list>
1.3Set集合
<set>
<value>11111</value>
<value>12222</value>
</set>
<set>
<ref bean
<set
</set>
1.4list集合
<list>
<value>11111</value>
<value>12222</value>
</list>
<set>
<ref bean
<set
</list>
1.5 Map集合
注意:map---entry ---key有特定的标签<key></key>
值根据对应类型选择对应类型的标签
<map>
<entry>
<key><value>zhangsan</value><key>
<value>123456</value>
</entry>
<entry>
<key><value>list</value><key>
<ref bean
</entry>
</map>
1.6Properties
<props>
<prop key="key1">value1</prop>
<prop key="key2">value2</prop>
</props>
2.用户自定义类型
第一种方式
为成员变量提供set get 方法
<bean id="userService" class="xxxx.UserServiceImpl">
<properties name="userDAO"> //userDAO 需要这个对象
<bean class ="xxxx.UserDAOImpl"/> //用bean标签创建对象
</properties>
</bean>
第二种方式
第一种赋值方式存在的问题
配置文件代码冗余
被注入的对象(UserDAO),多次创建,浪费(JVM)内存资源
配置文件中进行配置
<bean id="userDAO" class="xxx.UserDAOImpl">
</bean>
<bean id="userService" class="xxx.UserServiceImpl">
<property name="userDAO">
<ref bean="userDAO"/>
</property>
</bean>
ref引用,解决内存资源浪费的问题,很多个对象都可以引用这一个对象。
3.set注入的简化写法
3.1基于属性简化
JDK类型注入
<property name="name">
<value>zhangsan</value>
<property>
<property name="name" value=“zhangsan”/>
注意:value属性,只简化8种基本数据类型+String 注入标签
3.2用户自定义类型
<property name="userDAO">
<ref bean =“userDAO“/>
<property>
<property name="userDAO" ref="userDAO">
3.3基本命名空间P简化(p代表property)
JDK类型注入
<bean id="person" class="xxx.Person>
<property name="name">
<value>zhangsan</value>
<property>
<property name="name" value="zhangsan"/>
注意:value属性,只简化8种基本数据类型+String 注入标签
3.4用户自定义类型
<bean id="userService" class="xxx.UserServiceImpl">
<property name="userDAO">
<ref bean ="userDAO"/>
</property>
</bean>
<bean id ="userService" class="xxx.UserServiceImpl" p:userDAO-ref="userDAO"/>
构造注入
注入:通过Spring的配置文件,为成员变量赋值
Set注入:Spring调用Set方法,通过配置文件,为成员变量赋值
构造注入:Spring调用构造方法,通过配置文件,为成员变量赋值。
1.开发步骤
提供有参的构造方法
Public class Customer{
Private String name;
Private int age;
Public Customer (String name,int age){
this.name=name;
this.age=age;
}
}
Spring的配置文件
<bean id="customer" class="com.dmsd.mapper.contstructer.Customer">
<constructor-arg>
<value>zhangsan</value>
</constructor-arg>
<constructor-arg>
<value>111</value>
</constructor-arg>
</bean>
用构造方法正如上面有几个参数,就需要写几个<constructor-arg>标签。
2.构造方法重载
2.1参数个数不同时
通过控制<constructor-arg>标签的数量进行区分
2.2构造参数个数相同时
通过在标签引入type属性,进行类型区分<constructor-arg type="">