目录
1、依赖注入的概念
所谓依赖注入,是指在程序运行过程中,如果需要调用另一个对象协助时,无须在代码中创建按被调用者,而是依赖外部注入。
2、依赖注入的方式和内容
Spring的依赖注入:
只有3种:(先讲2种)
1.通过构造函数注入
2.通过set方法注入
注入的内容:
第一类:基本类和String类型
第二类:其他的bean类型
第三类:复杂类型(集合类型)
1)使用构造函数注入
涉及的标签:
constructor-arg
该标签是在bean内部的子标签
标签的属性:
type:指定要注入的参数在构造函数中的类型
index:指定要注入的参数在构造函数中的索引位置
name:指定参数在构造函数中的名称
value:指定注入的数据内容,它只能指定基本数据类型和String类型
ref:指定其他bean类型数据。写的是其他bean的id。其他bean指的是在Spring容器中的bean
注:constructor-arg数量要与构造函数的参数个数一致,否则会报错
bean.xml:
<bean id="accountService" class="yilai.AccountServiceImpl">
<constructor-arg name="name" value="Jack"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="date" ref="now"></constructor-arg>
</bean>
<!-- 定义一个日期对象 -->
<bean id="now" class="java.util.Date"></bean>
Client:
package yilai;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//表现层
public class Client {
//获取Spring的核心容器,并根据id获取对象
public static void main(String[] args) throws ClassNotFoundException {
//1.获取Spring的核心容器
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2.根据id获取对象
IAccountService as = (IAccountService) ac.getBean("accountService");
as.save();
}
}
AccountServiceImpl:
package yilai;
import java.util.Date;
//业务层实现类
public class AccountServiceImpl implements IAccountService{
private String name;
private int age;
private Date date;
public AccountServiceImpl(String name, int age, Date date) {
super();
this.name = name;
this.age = age;
this.date = date;
}
@Override
public void save() {
System.out.println("执行了。。。"+name+", "+age+", "+date);
}
}
2)使用set方法注入(常用)
涉及的标签:
property
标签的属性:
name:指定set方法的名称,是set后面的部分
value:.......
ref:.......
bean.xml:
<bean id="accountService2" class="yilai.AccountServiceImpl2">
<property name="name" value="Jack"></property>
<property name="age" value="18"></property>
<property name="date" ref="now"></property>
</bean>
package yilai;
import java.util.Date;
//业务层实现类
public class AccountServiceImpl2 implements IAccountService{
private String name;
private int age;
private Date date;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public void save() {
System.out.println("执行了。。。"+name+", "+age+", "+date);
}
}
扩展:p空间注入
它需要类中提供set方法,同时需要在配置文件中导入p空间
修改:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
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="accountService3" class="yilai.AccountServiceImpl3" p:name="Jack"></bean>
package yilai;
import java.util.Date;
//业务层实现类
public class AccountServiceImpl3 implements IAccountService{
private String name;
private int age;
private Date date;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setDate(Date date) {
this.date = date;
}
@Override
public void save() {
System.out.println("执行了。。。"+name+", "+age+", "+date);
}
}
复杂类型注入
注:结构相同的标签,数据内容互换,不会造成影响,(array,list,set)(map,properties)
<bean id="accountService4" class="yilai.AccountServiceImpl4">
<!-- 数组注入 -->
<property name="s">
<array>
<value>aaa</value>
<value>bbb</value>
<value>bbb</value>
</array>
</property>
<!-- list注入 -->
<property name="list">
<list>
<value>aaa</value>
<value>bbb</value>
<value>bbb</value>
</list>
</property>
<!-- set注入 -->
<property name="set">
<set>
<value>aaa</value>
<value>bbb</value>
<value>bbb</value>
</set>
</property>
<!-- map注入 -->
<property name="map">
<map>
<!-- 两种写法 -->
<entry key="a" value="A"></entry>
<entry key="b">
<value>B</value>
</entry>
</map>
</property>
<!-- properties注入 -->
<property name="pro">
<props>
<prop key="c">C</prop>
<prop key="d">D</prop>
</props>
</property>
</bean>
package yilai;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
//业务层实现类
public class AccountServiceImpl4 implements IAccountService{
private String[] s;
private List<String> list;
private Set<String> set;
private Map<String, String> map;
private Properties pro;
public void setS(String[] s) {
this.s = s;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setPro(Properties pro) {
this.pro = pro;
}
@Override
public void save() {
System.out.println(Arrays.toString(s));
System.out.println(list);
System.out.println(set);
System.out.println(map);
System.out.println(pro);
}
}