上一篇文章我们简单介绍了一下Spring的依赖注入,下面,我们来说一说Spring依赖注入的方式

所谓依赖注入(Dependency Injection),就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

依赖注入是 Spring 框架核心 IOC 的具体实现。在编写程序时,通过控制反转,把对象的创建交给了 Spring,但是代码中不可能出现没有依赖的情况。IOC 解耦只是降低他们的依赖关系,但不会消除。例如:业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 Spring 之后,就让 Spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。

Spring有三种依赖注入方式:

1.set方法

2.p命名空间注入

3.构造方法

我们的需求是:将UserDaoImpl注入到UserService

如果没有使用依赖注入之前,我们是怎么做的呢?需要用到的时候去找Spring容器拿

首先,我们有UerServices接口和UserDao接口:

UerServices接口:

public interface UserService {
    public void save();
}

UserDao接口:

public interface UserDao {
    public void save();
}

UserDaoImpl实现类:

public class UserDaoImpl implements UserDao {

    public void save() {
        System.out.println("save running....");
    }

}

 最关键的UserServiceImpl实现类:

public class UserServiceImpl implements UserService {
    private UserDao userDao;

   
    public void save(){
        //UserServices要调UserDao,UserDao由spring产生
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao=(UserDao)app.getBean("userDao");
        userDao.save();
    }
}

我们一个一个来看使用依赖注入方式都是怎么做的---
1.set方法:

首先,在UserService要引入UserDao:

private UserDao userDao;

为它创建一个set方法:

public void setUserDao(UserDao userDao) {

    this.userDao = userDao;

}

使用了set方法,我们不用自己从容器里获得dao了,因为在容器内部已经将dao通过setUserDao注给我们了,我们可以直接通过容器中的dao调用私有方法了

public void save(){

        userDao.save();

 }

需要告诉配置文件我们要在容器中将dao注给service

spring mysql 依赖 spring如何实现依赖注入的_set方法

<property name="userDao" ref="userDao"></property>

解析:要把容器中的userDao通过UserService内部的一个setUserDao方法注给它

这就是依赖注入的一种体现

spring mysql 依赖 spring如何实现依赖注入的_依赖注入_02

如果这样写:

spring mysql 依赖 spring如何实现依赖注入的_set方法_03

运行,会提示空指针异常,为什么呢?

spring mysql 依赖 spring如何实现依赖注入的_命名空间_04

原因,当前web层的service不是从容器拿的,容器中的service才注入了dao,自己new的对象内部没有注dao

2.p命名空间注入

本质也是set方法注入,但比set方法注入更加简单方便,添加set方法一样,但是配置文件更加的简单

首先,什么是命名空间?

spring mysql 依赖 spring如何实现依赖注入的_set方法_05

什么是p命名空间?

spring mysql 依赖 spring如何实现依赖注入的_set方法_06

p命名空间有两种注入方式:注入普通对象和注入对象引用

spring mysql 依赖 spring如何实现依赖注入的_spring mysql 依赖_07

在这里,我们用到的是注入对象引用的方式

spring mysql 依赖 spring如何实现依赖注入的_spring mysql 依赖_08

3.构造注入

注释掉set方法

spring mysql 依赖 spring如何实现依赖注入的_命名空间_09

生成一个有参构造,右键-->generate-->constructor

spring mysql 依赖 spring如何实现依赖注入的_依赖注入_10

生成一个无参构造,右键-->generate-->constructor-->select none

spring mysql 依赖 spring如何实现依赖注入的_spring mysql 依赖_11

spring mysql 依赖 spring如何实现依赖注入的_命名空间_12

配置配置文件:

spring mysql 依赖 spring如何实现依赖注入的_依赖注入_13