上一篇文章我们简单介绍了一下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
<property name="userDao" ref="userDao"></property>
解析:要把容器中的userDao通过UserService内部的一个setUserDao方法注给它
这就是依赖注入的一种体现
如果这样写:
运行,会提示空指针异常,为什么呢?
原因,当前web层的service不是从容器拿的,容器中的service才注入了dao,自己new的对象内部没有注dao
2.p命名空间注入
本质也是set方法注入,但比set方法注入更加简单方便,添加set方法一样,但是配置文件更加的简单
首先,什么是命名空间?
什么是p命名空间?
p命名空间有两种注入方式:注入普通对象和注入对象引用
在这里,我们用到的是注入对象引用的方式
3.构造注入
注释掉set方法
生成一个有参构造,右键-->generate-->constructor
生成一个无参构造,右键-->generate-->constructor-->select none
配置配置文件: