依赖注入就是一个类需要另一个类的协助来完成工作,这就产生了依赖,所以需要的依赖项就要注入过来协同完成工作,依赖注入是实现控制反转的方式之一。
构造器注入
构造器注入保证了一些必要的属性在Bean实例化时就设置,并且确保了bean实例在实例化后就可以使用。在类中,不用为属性设置setter方法,只需提供构造方法即可,在构造文件中配置该类bean,并配置构造器,在配置构造器中用。
方式一(根据参数名字注入,推荐使用)
<!-- 第二种根据参数名字设置 --><bean id="user" class="com.wjh.po.User"><constructor-arg name="name" value="阿离"/></bean>
方式二(根据index参数下标注入)
<bean id="user" class="com.wjh.po.User">
<constructor-arg index="0" value="阿离"/>
</bean>
方式三(根据参数类型注入,不推荐使用)
<bean id="user" class="com.wjh.po.User">
<constructor-arg type="java.lang.String" value="阿离"/>
</bean>
set注入
set注入是根据property标签的name属性的值去找对应的setter方法,如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。
package com.wjh.po;
import java.util.*;
/**
* @author wjh
* @date 2021/7/16 20:07
* @Package com.wjh.po
*/
public class Student {
private String name;
private Address address;
private String[] books;
private List<String> hobbies;
private Map<String,String> cards;
private Set<String> games;
private String wife;
private Properties properties;
setXxx
getXxx
....
}
package com.wjh.po;
/**
* @author wjh
* @date 2021/7/16 20:06
* @Package com.wjh.po
*/
public class Address {
private String province;
private String city;
private String county;
private String detail;
setXxx
getXxx
....
}
XML配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="address" class="com.wjh.po.Address">
<property name="province" value="广东省"/>
<property name="city" value="深圳市"/>
<property name="county" value="南山区"/>
<property name="detail" value="腾讯大夏timi工作室666号"/>
</bean>
<bean id="student" class="com.wjh.po.Student">
<!--常量注入-->
<property name="name" value="阿离"/>
<!--bean注入-->
<property name="address" ref="address"/>
<!--数组注入-->
<property name="books">
<array>
<value>《三国演义》</value>
<value>《水浒传》</value>
<value>《红楼梦》</value>
<value>《西游记》</value>
</array>
</property>
<!--List注入-->
<property name="hobbies">
<list>
<value>听歌</value>
<value>打代码</value>
<value>小姐姐</value>
</list>
</property>
<!--Map注入-->
<property name="cards">
<map>
<entry key="身份证" value="432524200110126736"/>
<entry key="银行卡" value="12563149924854541138894"/>
</map>
</property>
<!--Set注入-->
<property name="games">
<set>
<value>王者荣耀</value>
<value>LOL</value>
</set>
</property>
<!--null注入-->
<property name="wife">
<null/>
</property>
<!--properties注入-->
<property name="properties">
<props>
<prop key="driver">com.mysql.cj.jdbc.Driver</prop>
<prop key="url">jdbc:mysql://127.0.0.1:3306/mybatis</prop>
<prop key="username">root</prop>
<prop key="password">wujiahao269139</prop>
</props>
</property>
</bean>
</beans>
其它注入
p命名空间注入:
导入约束 : xmlns:p="http://www.springframework.org/schema/p"
<!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>
c命名空间注入:
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<!--C(构造: Constructor,需要有参构造器)命名空间 , 属性依然要设置set方法-->
<bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>
