文章目录
spring依赖注入
- 依赖关系的管理,以后都交给spring来维护
- 在当前类需要用到其他类的对象,由spring为我们提供,我们只需要在配置文件中说明
- 依赖关系的维护,就称为依赖注入
能注入的数据
- 基本类型和String
- 其他bean类型(配置文件中或者注解配置过的bean)
- 复杂类型(集合类型)
注入方式
- 构造函数
- 使用set方法提供
- 使用注解提供
经常变化的数据,并不适用于注入方式
构造函数注入(construct-arg)
使用construct-arg标签(bean标签的内部)
bean.xml配置如下
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl" >
<constructor-arg name="name" value="zhangsan"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="birthday" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
public class AccountServiceImpl implements IAccountService {
private String name;
private Integer age;
private Date birthday;
public AccountServiceImpl(String name, Integer age, Date birthday) {
this.name = name;
this.age = age;
this.birthday = birthday;
}
}
construct-arg标签属性
- type:指定要注入的数据类型,该数据类型也是构造函数中某个参数的类型(该标签不能单独工作)
- index:指定要注入的数据给构造函数中指定索引位置的参数赋值,计数从0开始
- name:用于指定给构造函数指定名称的参数赋值**(常用)**
以上三个用于指定给构造函数哪个参数赋值
- value:用于给基本类型,和String类型的数据
- ref:用于指定其他bean数据类型。他指的是spring的Ioc核心容器中出现过的bean对象
优劣势
优势:获取bean对象时,注入数据是必须的操作,否则对象无法创建
劣势:改变了bean对象的实例化方式,是我们在创建对象的时候,如果用不到这些数据,也必须提供
set注入(property标签)(更常用)
这种方式仅需要set方法,对构造函数没有要求
<bean id="now" class="java.util.Date"></bean>
<bean id="accountService2" class="com.itheima.service.impl.AccountServiceImpl2" >
<property name="name" value="zzq"></property>
<property name="age" value="12"></property>
<property name="birthday" ref="now"></property>
</bean>
property标签属性
- name:用于指定注入时所调用set方法名称
- value:用于给基本类型,和String类型的数据
- ref:用于指定其他bean数据类型。他指的是spring的Ioc核心容器中出现过的bean对象
优劣势
优势:创建对象时没有明确的限制,可以直接使用默认构造函数
劣势:不能保证某个成员必须有值
注入集合数据:
<property name="myStrs">
<array>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</array>
</property>
<property name="myList">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="mySet">
<set>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</set>
</property>
<property name="myMap">
<map>
<entry key="texta" value="a"></entry>
<entry key="aa" value="bb"></entry>
</map>
</property>
<property name="mypro">
<props>
<prop key="a">aaa</prop>
<prop key="d">ddd</prop>
</props>
</property>