Spring——依赖注入

开启DI服务(依赖注入)

DI依赖注入的理解

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

基于XML文件

通过set方法注入

  1. property标签通过调用属性对应的set方法完成赋值
  2. 属性赋值
    1. 基本类型赋值 value="xxx"
    2. 引用类型赋值 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() {
    }
    。。。
}

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值