4:依赖注入
4.1:setter注入
<!--注入简单类型--> <bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"> <!--property标签:设置注入属性--> <!--name属性:设置注入的属性名,实际是set方法对应的名称--> <!--value属性:设置注入简单类型数据值--> <property name="connectionNum" value="100"/> <property name="databaseName" value="mysql"/> </bean>
<!--注入引用类型--> <bean id="bookService" class="com.ysj.service.impl.BookServiceImpl"> <!--property标签:设置注入属性--> <!--name属性:设置注入的属性名,实际是set方法对应的名称--> <!--ref属性:设置注入引用类型bean的id或name--> <property name="bookDao" ref="bookDao"/> <property name="userDao" ref="userDao"/> </bean>
4.2🥊构造器注入
<!-- 标准书写--> <bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"> <!-- 根据构造方法参数名称注入--> <constructor-arg name="connectionNum" value="10"/> <constructor-arg name="databaseName" value="mysql"/> </bean> <bean id="userDao" class="com.ysj.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.ysj.service.impl.BookServiceImpl"> <constructor-arg name="userDao" ref="userDao"/> <constructor-arg name="bookDao" ref="bookDao"/> </bean>
<!-- 解决形参名称的问题,与形参名不耦合(了解)--> <bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"> <!-- 根据构造方法参数类型注入--> <constructor-arg type="int" value="10"/> <constructor-arg type="java.lang.String" value="mysql"/> </bean> <bean id="userDao" class="com.ysj.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.ysj.service.impl.BookServiceImpl"> <constructor-arg name="userDao" ref="userDao"/> <constructor-arg name="bookDao" ref="bookDao"/> </bean>
<!-- 解决参数类型重复问题,使用位置解决参数匹配--> <bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"> <!--根据构造方法参数位置注入--> <constructor-arg index="0" value="mysql"/> <constructor-arg index="1" value="100"/> </bean> <bean id="userDao" class="com.ysj.dao.impl.UserDaoImpl"/> <bean id="bookService" class="com.ysj.service.impl.BookServiceImpl"> <constructor-arg name="userDao" ref="userDao"/> <constructor-arg name="bookDao" ref="bookDao"/> </bean>
4.3:依赖注入方式选择
1:铭记一点:推荐使用setter注入 2:Spring官方和第三返回给机构使用构造器是为了严谨 3:看具体项目,只有构造器注入的话也只能用了
4.4:自动装配
byType
:按类型装配(容器中相同类型的bean必须唯一,推荐推荐)byName
:按名称装配(容器中要有相应名称的bean,因为变量名与配置的名称耦合,不推荐)- 自动装配适用于引用类型的注入,并不能对简单类型进行操作
- 自动装配的优先级低于setter注入和构造器注入,同时有可能出现自动装配失效
<!--这个id="bookDao"可以不写--> <bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"/> <!--autowire属性:开启自动装配,通常使用按类型装配--> <bean id="bookService" class="com.ysj.service.impl.BookServiceImpl" autowire="byType"/>
4.5:集合注入
着重记下map
<bean id="bookDao" class="com.ysj.dao.impl.BookDaoImpl"> <!--数组注入--> <property name="array"> <array> <value>100</value> <value>200</value> <value>300</value> </array> </property> <!--list集合注入--> <property name="list"> <list> <value>itcast</value> <value>ysj</value> <value>boxuegu</value> <value>chuanzhihui</value> </list> </property> <!--set集合注入--> <property name="set"> <set> <value>itcast</value> <value>ysj</value> <value>boxuegu</value> <value>boxuegu</value> </set> </property> <!--map集合注入(重点)--> <property name="map"> <map> <entry key="country" value="china"/> <entry key="province" value="henan"/> <entry key="city" value="kaifeng"/> </map> </property> <!--Properties注入--> <property name="properties"> <props> <prop key="country">china</prop> <prop key="province">henan</prop> <prop key="city">kaifeng</prop> </props> </property> </bean>