Spring依赖注入的两种实现方式

控制反转

依赖注入和控制反转含义相同,他们是从两个角度描述的同一个概念
当某个java实例需要另一个java实例时,传统的方法是由调用者创建被调用者的实例(使用new关键字获得被调用者实例),而使用Spring框架后,被调用者的实例不再由调用者创建,而是由Sping容器创建,这成为控制反转。

依赖注入

Spring容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过Spring容器获得被调用者实例,这称为依赖注入。
依赖注入有两种实现方式:分别是setter注入和构造方法注入
属性setter注入
指IoC容器使用setter方法注入被依赖的实例。通过调用无参构造或无参static工厂方法实例化Bean后,调用该bean的setter方法,即可实现基于setter的DI
构造方法注入
指IoC容器使用构造方法注入被依赖的实例,基于构造器的DI通过调用带参数的构造方法实现,每个参数代表一个依赖。

具体实现

创建PersonService接口

package com.mengma.ioc;

public interface PersonService {
    public void addPerson();
}

创建接口实现类PersonServiceImpl

package com.mengma.ioc;

public class PersonServiceImpl implements PersonService {

    // 定义接口声明
    private PersonDao personDao;

    // 提供set()方法,用于依赖注入
```java
    public void setPersonDao(PersonDao personDao) {
        this.personDao = personDao;
    }

    // 实现PersonService接口的方法
    @Override
    public void addPerson() {
        personDao.add(); // 调用PersonDao中的add()方法
        System.out.println("addPerson()执行了...");
    }

}

在applicationContext.xml中添加配置信息

<bean id="personService" class="com.mengma.ioc.PersonServiceImpl">
    <!-- 将personDao实例注入personService实例中 -->
    <property name="personDao" ref="personDao"/>
</bean>

编写测试方法

@Test
public void test2() {
    // 定义Spring配置文件的路径
    String xmlPath = "applicationContext.xml";
    // 初始化Spring容器,加载配置文件
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext(
            xmlPath);
    // 通过容器获取personService实例
    PersonService personService = (PersonService) applicationContext
            .getBean("personService");
    // 调用personService的addPerson()方法
    personService.addPerson();
}

运行项目并查看结果
使用JUnit测试运行test2()方法,运行成功后,控制台的输出结果如下图所示
在这里插入图片描述
从上图结果可以看出,使用Spring容器获取userService的实例后,调用了该实例的addPerson()方法,在该方法中有调用了PersonDao实现类中的add()方法,并输出了结果。这就是Spring容器属性setter注入的方式,也是实际开发中较为常用的一种方式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值