一、Spring中的依赖注入
依赖注入(Dependency Injection),也称为DI。
1. 注入的方式有三种:
第一种:使用构造函数注入
第二种:使用set方式注入
第三种:使用注解注入
2. 注入的类型有三类:
第一类:基本类型和String类型
第二类:其他类Bean(必须是在Spring的配置文件中出现过的bean)
第三类:复杂累心(集合类型)
3. 依赖注入具体使用
第一种:构造函数注入
(1)涉及的标签:constructor-arg
(2)标签的属性:
type:指定参数的索引位置,从0开始。
index:指定参数的索引位置,从0开始。
name:指定参数的名称。一般是用此种
====上面三个属性是指定给哪个参数赋值的,下面两个属性是指定赋什么值的=
value:指定基本类型或String类型的数据
ref:指定引用其它数据类型
(3)标签出现的位置:写在bean标签内部
(4)具体实例
ICustomerService的实现类ICustomerServiceImp如下:
//客户的业务层实现类
public class ICustomerServiceImp implements ICustomerService {
private String driver;
private Integer port;
private Date today;
public ICustomerServiceImp(String driver, Integer port, Date today) {
this.driver = driver;
this.port = port;
this.today = today;
}
@Override
public void saveCustomer() {
System.out.println("业务层调用持久层"+driver+","+port+","+today);
}
}
Main函数如下:
public static void main(String[] args) {
// 1.创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 2.根据bean的id获取容器
ICustomerService customerService = (ICustomerService) context.getBean("ICustomerServiceImp");
customerService.saveCustomer();
}
xml配置文件如下:
<bean id="ICustomerServiceImp" class="com.renjing.service.imp.ICustomerServiceImp">
<constructor-arg name="driver" value="com.mysql.jdbc.Driver"></constructor-arg>
<constructor-arg name="port" value="3306"></constructor-arg>
<constructor-arg name="today" ref="now"></constructor-arg>
</bean>
<bean id="now" class="java.util.Date"></bean>
第二种:set方法注入
(1)涉及的标签:property
(2)标签的属性:
name:指定参数的set方法名称
===上面一个属性是指定给哪个参数赋值的,下面两个属性是指定赋什么值的=
value:指定基本数据类型或String类型的数据
ref:指定其他bean类型数据
(3)标签出现的位置:
写在bean标签内部。
(4)具体实例
ICustomerService2 的实现类ICustomerService2Imp2如下:
//客户的业务层实现类
public class ICustomerServiceImp2 implements ICustomerService2 {
private String driver;
private Integer port;
private Date today;
public ICustomerServiceImp2() {
}
public ICustomerServiceImp2(String driver, Integer port, Date today) {
this.driver = driver;
this.port = port;
this.today = today;
}
public String getDriver() {
return driver;
}
public void setDriver(String driver) {
this.driver = driver;
}
public Integer getPort() {
return port;
}
public void setPort(Integer port) {
this.port = port;
}
public Date getToday() {
return today;
}
public void setToday(Date today) {
this.today = today;
}
@Override
public void saveCustomer() {
System.out.println("业务层调用持久层"+driver+","+port+","+today);
}
}
xml配置文件如下:
<bean id="ICustomerService2" class="com.renjing.service.imp.ICustomerServiceImp2">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="port" value="3307"></property>
<property name="today" ref="now"></property>
</bean>
Mian函数如下:
public static void main(String[] args) {
// 1.创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 2.根据bean的id获取容器
ICustomerService2 customerService2 = (ICustomerService2) context.getBean("ICustomerService2");
customerService2.saveCustomer();
}
执行结果如下:
第三种:复杂类型的注入
(1)注意:结构相同,标签可以互换
(2)具体实例
ICustomerService3的具体实现类ICustomerServiceImp3如下:
//客户的业务层实现类
public class ICustomerServiceImp3 implements ICustomerService3 {
private String[] myStrs;
private List<String> myList;
private Set<String> mySet;
private Map<String,String> myMap;
private Properties myProps;
public String[] getMyStrs() {
return myStrs;
}
public void setMyStrs(String[] myStrs) {
this.myStrs = myStrs;
}
public List<String> getMyList() {
return myList;
}
public void setMyList(List<String> myList) {
this.myList = myList;
}
public Set<String> getMySet() {
return mySet;
}
public void setMySet(Set<String> mySet) {
this.mySet = mySet;
}
public Map<String, String> getMyMap() {
return myMap;
}
public void setMyMap(Map<String, String> myMap) {
this.myMap = myMap;
}
public Properties getMyProps() {
return myProps;
}
public void setMyProps(Properties myProps) {
this.myProps = myProps;
}
@Override
public void saveCustomer() {
System.out.println(Arrays.toString(myStrs));
System.out.println(myList);
System.out.println(mySet);
System.out.println(myMap);
System.out.println(myProps);
}
}
xml配置文件如下:注意:结构相同,标签可以互换,故未匹配相应的类型
<bean id="ICustomerService3" class="com.renjing.service.imp.ICustomerServiceImp3">
<property name="myStrs">
<set>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</set>
</property>
<property name="myList">
<array>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</array>
</property>
<property name="mySet">
<list>
<value>AAA</value>
<value>BBB</value>
<value>CCC</value>
</list>
</property>
<property name="myMap">
<props>
<prop key="testF">FFF</prop>
<prop key="testR">RRR</prop>
</props>
</property>
<property name="myProps">
<map>
<entry key="TestD" value="DDD"></entry>
<entry key="TestE">
<value>EEE</value>
</entry>
</map>
</property>
</bean>
Mian函数如下:
public static void main(String[] args) {
// 1.创建容器
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 2.根据bean的id获取容器
ICustomerService3 customerService3 = (ICustomerService3) context.getBean("ICustomerService3");
customerService3.saveCustomer();
}
执行结果如下: