微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

控制反转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是通过反射来实现注入的)的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐