概念
spring 给对象赋值的方式有两种 一种是配置文件,一种是注解
DI:依赖注入,给属性赋值
1、基于XML的实现:在spring的配置文件中,使用标签和 属性完成
2、基于注解实现:使用spring中的注解来完成属性的赋值
DI语法分类:
1、set注入(设置注入):spring调用类的set方法,在set方法可以实现属性的赋值。【80%左右都是使用该方法注入】
2、构造注入:spring中调用构造方法,创建对象,在构造方法中王车工赋值
基于XML的实现
set注入
set方法是在构造方法之后,才执行
1、bean配置文件:
<!--
声明dog对象
注入:就是属性的赋值
di:set注入的方式赋值
-->
<bean id="dog" class="com.phy.service.impl.Dog">
<!--简单类型赋值 Java的基本数据类型和字符串->
<property name="name" value="小狗"></property>
<property name="age" value="21"></property>
<!--引用类型赋值-->
<property name="cat" ref="bean的id"></property>
</bean>
<bean id="dog" class="com.phy.service.impl.Cat">
<property name="name" value="Tom"></property>
</bean>
2、注意事项
该类中必须含有set方法,方法名称必须符合命名规范,只要有set方法就可以执行。
也就是根据property的name找对应的setName()方法,进行赋值
构造注入
spring 调用类的有参构造方法,在创建对象的同时,在构造方法中给属性赋值。
1、bean配置文件:
<!--
name:构造方法的形参名
index:表示构造方法的参数位置,左到右从0开始
value:构造方法的形参类型是简单类型
ref:构造方法的形参类型是引用类型
-->
<bean id="dog" class="com.phy.service.impl.Dog">
<constructor-arg name="name" value="小狗"/>
<constructor-arg name="sex" value="母"/>
<constructor-arg name="age" value="21"/>
<!-- <constructor-arg name="Object" ref="Object"/>-->
</bean>
<bean id="dog1" class="com.phy.service.impl.Dog">
<constructor-arg index="0" value="小狗"/>
<constructor-arg index="1" value="母"/>
<constructor-arg index="2" value="21"/>
</bean>
2、注意事项:
beans.xml中声明对象不用关心顺序,当创建Dog对象时,发现引用十五Object找不到,会对配置文件进行二次扫描。
3、通过构造注入注入文件对象
<bean id="file" class="java.io.File">
<constructor-arg name="parent" value="文件路径"/>
<constructor-arg name="child" value="文件名.后缀"/>
</bean>
引用类型的自动注入
spring框架可以根据某些规则可以给引用类型赋值,最常用的规则是byName和byType
byName:通过名称自动注入
Java类中引用类型的属性名和spring容器中(配置文件)的id名称一样,并且数据类型是一样的,这样的容器中的bean,spring可以直接赋值给引用类型。
<bean id="file" class="java.io.File" autowire="byName"></bean>
byType :通过类型自动注入
注意:使用byType时,配置文件中的bean只能有一个
Java类中引用类型的数据类型和spring容器中(配置文件)的class属性是同源关系的,这样的bean可以直接赋值给引用类型。
同源关系:
1、Java类中引用类型的数据类型和class的值是一样的
2、Java类中引用类型的数据类型和class的值是父子关系的(Java类中数据类型是父)
3、Java类中引用类型的数据类型和class的值是接口与实现类关系的(Java类中的数据类型是接口)
<bean id="file" class="java.io.File" autowire="byType"></bean>