您的位置:首页 > 编程语言 > Java开发

SSH之Spring——IOC如何实现依赖注入

2014-09-09 15:01 633 查看
一、什么是IOC

IOC(Inversion of Control)控制反转,轻量级的Spring框架的核心,管理对象。就是一个对象如何获取所依赖对象的引用,责任的反转。本来由应用程序管理对象之间的依赖关系,现在交给了容器管理,这叫控制反转。即交给了IOC容器,Spring的IOC容器主要使用注入方式实现,不需要主动查找,对象的查找、定位和创建都由容器管理。

二、准备工作

根据类图建立类,关系如下:






三、一般的实现方式

UserManager依赖UserDao,它要主动实例化类,用应用程序负责定位类,这是咱们平时的操作:

public class UserManagerImpl implements UserManager {

public void addUser(String username, String password) {
//由我们的应用程序负责服务(对象)定位
UserDao userDao = new UserDao4MySqlImpl();
userDao.addUser(username, password);
}

}
客户端同样也要实例化UserManager的实现类

public class Client {

public static void main(String[] args) {

//由我们的应用程序负责服务(对象)定位
UserManager userManager = new UserManagerImpl();
userManager.addUser("zhangdan", "123");

}

}


四、IOC容器实现方法

让spring管理我们对象的创建和依赖,必须将依赖关系配置到spring的核心配置文件(applicationContext.xml)中

1.用构造函数法

也就是通过构造函数将UserDao实现注入过来

先看配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> 
<bean id="userDao4MySql" class="com.zx.spring.dao.UserDao4MySqlImpl"/>
<bean id="userDao4Oracle" class="com.zx.spring.dao.UserDao4OracleImpl" />

<bean id="userManager" class="com.zx.spring.manager.UserManagerImpl" >
<!--  构造方法 -->
<constructor-arg ref="userDao4Oracle"/>

</bean>

</beans>
配置文件中将DAO的实现类配置过来,其中id是唯一标识,在配置UserManager时,配置Dao引用即ref,它的值是实现类的id

看UserManager的实现类如何通过构造函数实现注入

public class UserManagerImpl implements UserManager {

private UserDao userDao;

public UserManagerImpl(UserDao userDao) {

this.userDao = userDao;
}

public void addUser(String username, String password) {

userDao.addUser(username, password);
}

}


构造函数中将Dao作为参数传递实现注入

客户端的代码如下

public class Client {
public static void main(String[] args) {

//请求IOC容器
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");

UserManager userManager = (UserManager)factory.getBean("userManager");

userManager.addUser("zhangdan", "123");
}
}


2.setter方法

以设值的方式实现注入

配置文件如何配置

<bean id="userManager" class="com.zx.spring.manager.UserManagerImpl" >
<!-- setter方法 -->
<property name="userDao" ref="userDao4MySql"/>

</bean>
name的值是setUserDao的方法名字,去掉set并且首字母小写,只是与引用的名字形同而已,这个地方要注意。

看UserManager的实现类如何通过构造函数实现注入

public class UserManagerImpl implements UserManager {

private UserDao userDao;

public void addUser(String username, String password) {

userDao.addUser(username, password);
}
//setter方法
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}

}
客户端的实现相同,这里不重复写。

五、总结

1.方法没有好与坏,适合的就是最好的。构造函数法适用于类初始化就要传递参数,但是如果参数很多不建议用,建议使用setter方法。

2.IOC容器很好的解耦,将一般实现中耦合部分放到xml文件中,不用应用程序维护依赖关系,即将接口实现注入到需要的类中,依赖关系的形成利用反射机制。

3.大量减少了Factory和单例的数量,使代码更加清晰,主要原因是我们不再查找、定位、创建和管理对象之间的依赖关系,都交给IOC容器管理

对Spring的学习刚开始,如果有理解错误的地方请多多指教。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: