标签。要求Spring容器对象调用当前类中的有参构造方法完成对象创建与初始化。">
当前位置:   article > 正文

Spring——依赖注入

Spring——依赖注入

开启DI服务(依赖注入)

DI依赖注入的理解

  1. 依赖开发人员提供相关输入
  2. 依赖Spring容器对象将相关数据赋到属性中

基于XML文件

通过set方法注入

  1. property标签通过调用属性对应的set方法完成赋值
  2. 属性赋值
    1. 基本类型赋值 value="xxx"
    2. 引用类型赋值 ref = "xxx"
  1. <bean id="xxx" class="com.wry.bean.Emp">
  2. <property name="属性名" value="属性值"/>
  3. <property name="属性名" ref="Spring容器中已拥有的key"/>
  4. </bean>
演示
  1. <bean id="dept" class="com.wry.bean.Dept">
  2. <property name="deptno" value="1"/>
  3. <property name="dname" value="Accounting"/>
  4. <property name="loc" value="Beijing"/>
  5. </bean>
  6. <bean id="emp" class="com.wry.bean.Emp">
  7. <property name="empno" value="3"/>
  8. <property name="ename" value="Zhangsan"/>
  9. <property name="dept" ref="dept"/>
  10. </bean>
  1. public void test01(){
  2. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  3. Emp emp = (Emp) applicationContext.getBean("emp");
  4. System.out.println(emp);//Emp{empno = 3, ename = Zhangsan, dept = Dept{deptno = 1, dname = Accounting, loc = Beijing}}
  5. }

通过构造方法注入

要求Spring容器对象调用当前类中的有参构造方法完成对象创建与初始化

<constructor-arg index="xxx"/name="empno" value="">标签

  • name/index属性二选一
    • index为参数的下标
    • name为参数名
  • value/ref二选一
    • value 简单类型
    • ref 引用类型
演示
  1. <bean id="dept" class="com.wry.bean.Dept">
  2. <constructor-arg index="0" value="1"/>
  3. <constructor-arg index="1" value="Accounting"/>
  4. <constructor-arg index="2" value="Beijing"/>
  5. </bean>
  6. <bean id="emp" class="com.wry.bean.Emp">
  7. <constructor-arg name="empno" value="10"/>
  8. <constructor-arg name="ename" value="Zhangsan"/>
  9. <constructor-arg name="dept" ref="dept"/>
  10. </bean>
  1. public void test01(){
  2. ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");
  3. Emp emp = (Emp) app.getBean("emp");
  4. System.out.println(emp);//Emp{empno = 10, ename = Zhangsan, dept = Dept{deptno = 1, dname = Accounting, loc = Beijing}}
  5. }

基于注解

  • 条件
    • 注解并不需要有set方法
    • 必须有无参构造方法才可以使用注解进行依赖注入
  • 基本类型
    • @Value("属性值")
  • 引用类型
    • @Autowired
      • 翻译:自动注入
      • 注入逻辑
        • 默认情况下,Spring容器使用属性名称作为key,到Spring容器对象寻找对应对象
        • 如果在Spring容器对象并不存在以属性名作为key的对象,则在Spring容器内寻找与当前属性类型相匹配对象进行赋值
        • 无属性名作为key的对象且相同属性类型对象有两个时,抛出异常
    • @Qualifier("id")
      • 注入id对应的引用对象

演示

XML配置文件与测试类
<context:component-scan base-package="com.wry.bean"/>
  1. public void newObjectTest01(){
  2. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
  3. Emp emp = (Emp) applicationContext.getBean("emp");
  4. System.out.println(emp);
  5. }
@Autowire
  1. @Component
  2. public class Dept {
  3. @Value("100")
  4. private Integer deptno;
  5. @Value("市场部")
  6. private String dname;
  7. @Value("北京")
  8. private String loc;
  9. public Dept() {
  10. }
  11. public Dept(Integer deptno, String dname, String loc) {
  12. this.deptno = deptno;
  13. this.dname = dname;
  14. this.loc = loc;
  15. }
  16. 。。。
  17. }
  1. @Component
  2. public class Emp {
  3. @Value("1000")
  4. private Integer empno;
  5. @Value("张三")
  6. private String ename;
  7. @Autowired
  8. private Dept dept;
  9. public Emp() {
  10. }
  11. 。。。
  12. }
@Qualifier("id")
  1. @Component
  2. public class Dept {
  3. @Value("100")
  4. private Integer deptno;
  5. @Value("市场部")
  6. private String dname;
  7. @Value("北京")
  8. private String loc;
  9. public Dept() {
  10. }
  11. public Dept(Integer deptno, String dname, String loc) {
  12. this.deptno = deptno;
  13. this.dname = dname;
  14. this.loc = loc;
  15. }
  16. 。。。
  17. }
  1. @Component
  2. public class Emp {
  3. @Value("1000")
  4. private Integer empno;
  5. @Value("张三")
  6. private String ename;
  7. @Qualifier("dept")
  8. private Dept dept;
  9. public Emp() {
  10. }
  11. 。。。
  12. }

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号