【Spring】Spring对IoC的实现和依赖注入专题

1. 依赖注入:

1.1 set注入:

  • 基于set方法实现的, 底层会通过反射机制调用属性对应的set方法然后给属性赋值

  • 这种方式要求属性必须对外提供set方法

  • set注入的核心实现原理: 通过反射机制调用set方法来给属性赋值, 让俩个对象之间产生关系

// xml
<!-- 配置userDao    -->
<bean id="userDaoBean" class="com.powernode.bean.UserDao"/>

<!-- 配置vipDao    -->
<bean id="vipDaoBean" class="com.powernode.bean.VipDao"/>

<!-- 配置User   -->
<bean id="userBean" class="com.powernode.bean.User">
	<!-- 想让Spring调用对应的set方法, 需要配置property标签
	name属性怎么知道值: set方法的方法名, 去掉set, 然后把剩下的首字母小写
	ref翻译为引用, ref后面指定的是要注入的bean的id  -->
	<property name="userDao" ref="userDaoBean"/>
	<property name="vipDao" ref="vipDaoBean"/>
</bean>
    
// User类
public class User {
    private UserDao userDao;
    private VipDao vipDao;

    public void setVipDao(VipDao vipDao) {
        this.vipDao = vipDao;
    }

    // set注入, 必须提供一个set方法
    // Spring容器会调用这个set方法, 来给userDao属性赋值
    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void saveUser(){
        userDao.saveId();
        vipDao.save();
    }
}

// @Test
public void setDI(){
    ApplicationContext ctx = new ClassPathXmlApplicationContext("spring.xml");
    User userBean = ctx.getBean("userBean", User.class);
    userBean.saveUser();
}

1.2 构造注入:

  • 核心原理: 调用构造方法来给属性赋值

  • set注入是在对象构建好了之后调用set方法来完成赋值, 构造注入是在对象实例化的过程中赋值的

// xml
<bean id="userDaoBean" class="com.powernode.bean.UserDao"/>

<bean id="vipDaoBean" class="com.powernode.bean.VipDao"/>

<!-- 构造注入3种方式   -->
<bean id="customerBean" class="com.powernode.bean.Customer">
    <!-- 指定构造方法的第一个参数, 下标是0 -->
    <constructor-arg index="0" ref="userDaoBean"/>
    <!-- 指定构造方法的第二个参数, 下标是1 -->
    <constructor-arg index="1" ref="vipDaoBean"/>

    <!-- 根据构造方法参数的名字进行注入 -->
    <constructor-arg name="userDao" ref="userDaoBean"/>
    <constructor-arg name="vipDao" ref="vipDaoBean"/>

    <!-- 这种方式实际上是根据类型进行注入, Spring会自动根据类型来判断把ref注入给哪个参数-->
    <constructor-arg ref="userDaoBean"/>
    <constructor-arg ref="vipDaoBean"/>
</bean>
    
// Customer类
public class Customer {
    private UserDao userDao;
    private VipDao vipDao;

    public Customer(UserDao userDao, VipDao vipDao) {
        this.userDao = userDao;
        this.vipDao = vipDao;
    }
    public void insert(){
        userDa
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珠江上上上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值