Spring笔记 04:依赖注入

it2025-10-15  10

1. 说明


1.1 能注入的数据的类型

基本类型和String其他bean类型(在配置文件或者注解中配置过的bean)复杂类型/集合类型

1.2 注入方式

使用构造函数提供使用set方法提供使用注解提供

如果是经常变化的数据,并不适用于注入的方式

2. 分类


2.1 构造函数注入(constructor-arg)

标签属性:

type:用于指定要注入的数据的数据类型,同时该数据类型也是构造函数中某个或某些参数的类型index:用于指定要注入的数据给构造函数中指定索引位置的参数赋值(参数索引的位置从0开始),默认的排列顺序就对应构造函数中参数的顺序name:用于指定给构造函数中指定名称的参数赋值value:用于提供基本类型和String类型的数据(也可使用子节点)(如果包括特殊字符,可以使用<![CDATA[]]>,但是只能用于子节点中)ref:用于指定其他的bean类型(在spring的ioc核心容器中出现过的bean对象)数据

特点:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功 弊端:改变了bean对象的实例化方式,在创建对象时,如果用不到这些数据也必须提供

<bean id="accountService" class="com.dudu.service.impl.AccountServiceImpl"> <constructor-arg name="name"> <value><![CDATA[ <费渡> ]]></value> </constructor-arg> <constructor-arg name="age" value="18"></constructor-arg> <constructor-arg name="birthday"> <!--配置一个日期对象 内部Bean 不能被外部引用--> <bean class="java.util.Date"></bean> </constructor-arg> <!-- 赋值为null --> <constructor-arg><null/></constructor-arg> <!-- 支持级联赋值,但是不能直接为属性赋值,需要对象已经创建出来了才可以 --> <constructor-arg name="person" ref="car"/> <property name="car.color" value="red"/> </bean>

2.2 set方法注入(property)

标签属性:

name:用于指定注入时所调用的set方法名称value:用于提供基本类型和String类型的数据ref:用于指定其他的bean类型(在spring的ioc核心容器中出现过的bean对象)数据

优势:创建对象时没有明确的限制,可以直接使用默认构造函数 弊端:如果有某个成员必须有值,则获取对象时set方法无法保证一定注入

<bean id="accountServiceSet" class="com.dudu.service.impl.AccountServiceImplSet"> <property name="name" value="骆闻舟"></property> <property name="age" value="21"></property> <property name="birthday" ref="now"></property> </bean> <!--配置一个日期对象 外部Bean--> <bean id="now" class="java.util.Date"></bean> <!-- 简化配置 --> <bean id="accountServiceSet" class="com.itheima.service.impl.AccountServiceImplSet" p:name="骆闻舟" p:age="30" p:birthday-ref="now"> </bean>

2.3 集合属性

用于给list结构集合注入的标签有list,array,set用于给map结构集合注入的标签有map,props结构相同,标签可以互换 <bean id="accountServiceList" class="com.dudu.service.impl.AccountServiceImplList"> <property name="myList"> <list><!-- 标签可以换成array或set --> <value>骆闻舟</value> <value>长庚</value> <value>赵锦辛</value> <!-- <ref bean="now"><bean></bean></ref> --> </list> </property> <property name="myMap"> <map><!-- 标签可以换成props --> <entry key="骆闻舟" value="费渡"/><!-- 标签可以换成prop --> <entry key="长庚" value="顾昀"/><!-- <prop key="骆闻舟">费渡</prop> --> <entry key="黎朔" value="赵锦辛"/> </map> </property> <!-- 配置独立的list --> <util:list id="cars"> <ref bean=""></ref> </util:list> </bean>

2.4 自动装配(autowire属性)

<bean id="car" class="com.dudu.beans.Car"> <property name="brand" value="Ferrari"/> <property name="price" value="3000000"/> </bean> <bean id="address" class="com.dudu.beans.Address"> <property name="city" value="燕城"/> <property name="street" value="南平大道"/> </bean> <!-- 按照Bean的名字进行自动装配,根据set方法后面的字符串作为名字来寻找Bean --> <bean id="person" class="com.dudu.beans.Person" autowire="byName"> <property name="name" value="费渡"/> </bean> <!-- 按照Bean的类型进行自动装配,此时Bean的id无所谓,但Bean要是单例的,同类型的Bean有两个会报错 --> <bean id="person" class="com.dudu.beans.Person" autowire="byType"> <property name="name" value="费渡"/> </bean>

缺点:

如果使用自动装配,Bean中的所有引用类型都要使用自动装配类型和名字只能使用一种,不可以混合使用

2.5 配置继承(parent属性)

<bean id="address1" class="com.dudu.beans.Address"> <property name="city" value="燕城"/> <property name="street" value="南平大道"/> </bean> <bean id="address2" parent="address1"> <property name="street" value="中央大道"/> </bean> 抽象Bean(不会初始化为实例,可以作为其他Bean初始化的模板)如果一个Bean的class属性没有指定,那么这个Bean必须是一个抽象Bean <bean id="address1" class="com.dudu.beans.Address" abstract="true"> <property name="city" value="燕城"/> <property name="street" value="南平大道"/> </bean>

2.6 配置依赖(depends-on属性)

表示依赖于car这个Bean,如果car不存在则会报错,哪怕该Bean本身并没有配置car存在多个依赖时可以用空格或逗号隔开 <bean id="person" class="com.dudu.beans.Person" depends-on="car address1"> <property name="name" value="费渡"/> </bean>

2.7 泛型依赖注入

public class BaseDao<T> { } @Repository public class UserDao extends BaseDao<User>{ } public class BaseService<T> { @Autowired private BaseDao<T> baseDao; public void add(){ System.out.println("BaseService ==>> add"); System.out.println(baseDao); } } @Service public class UserService<User> extends BaseService<User> { }

此时被注入service的类型是UserDao@3ecd23d9 引用关系是在父类之中建立的,但是在子类中也可以建立关系并且正确注入对应类型

最新回复(0)