一、什么是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的学习刚开始,如果有理解错误的地方请多多指教。