开启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;@Autowiredprivate 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() {}。。。
}