控制反转(IoC)和依赖注入(DI)
一.概念 ??? 本来是由应用程序管理的对象之间的依赖关系,现在交给了容器管理,这就叫做控制反转,即交给了loC(Inversionof Control)容器,spring的loC容器主要使用DI(DependencyInjection,依赖注入)方式实现的。不需要主动查找,对象的查找、定位和创建全部由容器管理。 ? ??? ps:IoC还有一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI来实现的(例如下面示例中UserManager要使用UserDao就是使用注入实现的)。 ? 二.示例 ??? 既然对控制反转的概念有了一定的了解,那么我们来看一个示例,看看它到底是如何实现的。 ??? 1.环境搭建 ??????? Spring的依赖包配置: ??????????? SPRING_HOME/dist/spring.jar ??????????? SPRING_HOME/lib/log4j/log4j-1.2.14.jar ??????????? SPRING_HOME/lib/jakarta-commons/commons-logging.jar ? ??????? Spring核心配置文件applicationContext.xml ??????????? <?xml version="1.0" encoding="UTF-8"?> <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"> <!-- 在IoC容器中注册UserDao4MySqlImpl类 --> <bean id="userDao4MySql" class="com.dan.spring.dao.UserDao4MySqlImpl"/> <!-- 在IoC容器中注册UserManagerImpl类 --> <bean id="userManager" class="com.dan.spring.manager.UserManagerImpl"> <!-- 使用setter方式进行注入,在userManager中注入userDao --> <property name="userDao" ref="userDao4MySql"/> </bean> </beans> ? ??? 2.代码 ??????? UserDao.java package com.dan.spring.dao; public interface UserDao { public void addUser(String username,String password); }
??????? UserDao4MySqlImpl.java package com.dan.spring.dao; public class UserDao4MySqlImpl implements UserDao { public void addUser(String username,String password) { System.out.println("UserDao4MySqlImpl.addUser()"); } }
??????? UserManager.java package com.dan.spring.manager; public interface UserManager { public void addUser(String username,String password); }
??????? UserManagerImpl.java package com.dan.spring.manager; import com.dan.spring.dao.UserDao; public class UserManagerImpl implements UserManager { //不使用IoC容器时 //public void addUser(String username,String password) { // UserDao userDao = new UserDao4MySqlImpl(); // userDao.addUser(username,password); //} private UserDao userDao; public void addUser(String username,String password) { userDao.addUser(username,password); } //使用setter方式进行注入 public void setUserDao(UserDao userDao) { this.userDao = userDao; } }
??????? Client.java package com.dan.spring.client; import org.springframework.beans.factory.BeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.dan.spring.manager.UserManager; public class Client { public static void main(String[] args) { //使用ClassPathXmlApplicationContext来读取配置文件 BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); //不使用IoC //UserManager userManager = new UserManagerImpl(new UserDao4MySqlImpl()); UserManager userManager = (UserManager)factory.getBean("userManager"); userManager.addUser("赵丹丹","123"); } }
? ??? 通过示例我们可以发现使用IoC不仅仅为我们节省了一些代码,更重要的是将对象的创建延迟到了容器中,使得我们的程序实现了解耦。 而我们使用DI(spring是通过反射来实现注入的)的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |