开启DI服务(依赖注入)
DI依赖注入的理解
- 依赖开发人员提供相关输入
- 依赖Spring容器对象将相关数据赋到属性中
基于XML文件
通过set方法注入
- property标签通过调用属性对应的set方法完成赋值
- 属性赋值
-
- 基本类型赋值 value="xxx"
- 引用类型赋值 ref = "xxx"
<bean id="xxx" class="com.wry.bean.Emp">
<property name="属性名" value="属性值"/>
<property name="属性名" ref="Spring容器中已拥有的key"/>
</bean>
演示
<bean id="dept" class="com.wry.bean.Dept">
<property name="deptno" value="1"/>
<property name="dname" value="Accounting"/>
<property name="loc" value="Beijing"/>
</bean>
<bean id="emp" class="com.wry.bean.Emp">
<property name="empno" value="3"/>
<property name="ename" value="Zhangsan"/>
<property name="dept" ref="dept"/>
</bean>
public void test01(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Emp emp = (Emp) applicationContext.getBean("emp");
System.out.println(emp);//Emp{empno = 3, ename = Zhangsan, dept = Dept{deptno = 1, dname = Accounting, loc = Beijing}}
}
通过构造方法注入
要求Spring容器对象调用当前类中的有参构造方法完成对象创建与初始化
<constructor-arg index="xxx"/name="empno" value="">标签
- name/index属性二选一
-
- index为参数的下标
- name为参数名
- value/ref二选一
-
- value 简单类型
- ref 引用类型
演示
<bean id="dept" class="com.wry.bean.Dept">
<constructor-arg index="0" value="1"/>
<constructor-arg index="1" value="Accounting"/>
<constructor-arg index="2" value="Beijing"/>
</bean>
<bean id="emp" class="com.wry.bean.Emp">
<constructor-arg name="empno" value="10"/>
<constructor-arg name="ename" value="Zhangsan"/>
<constructor-arg name="dept" ref="dept"/>
</bean>
public void test01(){
ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
Emp emp = (Emp) app.getBean("emp");
System.out.println(emp);//Emp{empno = 10, ename = Zhangsan, dept = Dept{deptno = 1, dname = Accounting, loc = Beijing}}
}
基于注解
- 条件
-
- 注解并不需要有set方法
- 必须有无参构造方法才可以使用注解进行依赖注入
- 基本类型
-
- @Value("属性值")
- 引用类型
-
- @Autowired
-
-
- 翻译:自动注入
- 注入逻辑
-
-
-
-
- 默认情况下,Spring容器使用属性名称作为key,到Spring容器对象寻找对应对象
- 如果在Spring容器对象并不存在以属性名作为key的对象,则在Spring容器内寻找与当前属性类型相匹配对象进行赋值
- 无属性名作为key的对象且相同属性类型对象有两个时,抛出异常
-
-
-
- @Qualifier("id")
-
-
- 注入id对应的引用对象
-
演示
XML配置文件与测试类
<context:component-scan base-package="com.wry.bean"/>
public void newObjectTest01(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Emp emp = (Emp) applicationContext.getBean("emp");
System.out.println(emp);
}
@Autowire
@Component
public class Dept {
@Value("100")
private Integer deptno;
@Value("市场部")
private String dname;
@Value("北京")
private String loc;
public Dept() {
}
public Dept(Integer deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
。。。
}
@Component
public class Emp {
@Value("1000")
private Integer empno;
@Value("张三")
private String ename;
@Autowired
private Dept dept;
public Emp() {
}
。。。
}
@Qualifier("id")
@Component
public class Dept {
@Value("100")
private Integer deptno;
@Value("市场部")
private String dname;
@Value("北京")
private String loc;
public Dept() {
}
public Dept(Integer deptno, String dname, String loc) {
this.deptno = deptno;
this.dname = dname;
this.loc = loc;
}
。。。
}
@Component
public class Emp {
@Value("1000")
private Integer empno;
@Value("张三")
private String ename;
@Qualifier("dept")
private Dept dept;
public Emp() {
}
。。。
}