初识spring——控制反转

案例分析:

    现在有这样一个需要,一个人甲要从A地到B地,需要向乙租赁公司组成,目前甲处于一家比较一般的公司,所以公司只允许甲租奇瑞QQ从A地开往B地。所以甲需要到租赁公司申请奇瑞QQ,然后完成从A地到B地的旅程。但是甲通过自己的努力,跳槽到一家上市公司,仍然需要从A地到B地,那么,甲还需要去租赁公司申请宝马,这里就需要修改甲申请的车的类。

 

    那么,有这样一种理想状态,就是甲不论是哪个公司,他只需要向租赁公司申请车即可,那具体是哪一种车,由需求来确定,这样,当加在更换公司需要租赁其他不重种类的车时,只需要修改可配置的需求即可,不需要修改甲需要调用的对象。

 

 

   

 

    在这里,spring的控制反转就很好的为我们实现了该功能。

控制反转

什么是控制反转(IoC)

    控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。控制反转还有一个名字叫做依赖注入(Dependency Injection)。简称DI

IOC的别名:依赖注入(DI)

    2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

    所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦

技术剖析

    我们可以把IOC容器的工作模式看做是工厂模式的升华,可以把IOC容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。

 

优缺点:

    IoC最大的好处是什么?因为把对象生成放在了XML里定义,所以当我们需要换一个实现子类将会变成很简单(一般这样的对象都是实现于某种接口的),只要修改XML就可以了,这样我们甚至可以实现对象的热插拨(有点象USB接口和SCSI硬盘了)。

    IoC最大的缺点是什么?(1)生成一个对象的步骤变复杂了(事实上操作上还是挺简单的),对于不习惯这种方式的人,会觉得有些别扭和不直观。(2)对象生成因为是使用反射编程,在效率上有些损耗。但相对于IoC提高的维护性和灵活性来说,这点损耗是微不足道的,除非某对象的生成对效率要求特别高。(3)缺少IDE重构操作的支持,如果在Eclipse要对类改名,那么你还需要去XML文件里手工去改了,这似乎是所有XML方式的缺憾所在。

 

 

    现在我们对IOC 有一定的了解之后,就可以解决上篇博客提到的问题了:

解决实际问题:

第一步,配置spring:

 1、  spring的以来包配置:

   a)        SPRING_HOME/dist/spring.jar

   b)        SPRING_HOME/lib/log4j/log4j-1.2.14.jar

   c)        SPRING_HOME/lib/Jakarta-commons/commons-logging.jar

 2、  提供spring配置文件applicationContext.xml

 3、  提供log4j.properties配置文件

第二步,编写配置文件:

    在我们有了基础的类之后,我们就要编写配置文件applicationContext.xml:

<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.bjpowernode.spring.dao.UserDao4MySqlImpl"></bean>
	
 	<bean id="userDaoMy4Oracle" class="com.bjpowernode.spring.dao.UserDao4MyOracleImpl"></bean>
	<bean id="userManager" class="com.bjpowernode.spring.manager.UserManagerImpl">
		<property name="userDao" ref="userDao4Mysql"></property>
	</bean>
</beans>


 

第三步,完成必要的类:

    具体的类编写在上篇博客中已经写到,这里只需要修改没有解耦合的类即可,以UserManagerImpl为例:

public class UserManagerImpl implements UserManager {

	private UserDao userDao;
	
	@Override
	public void addUser(String username, String password) {
		
	userDao.addUser(username, password);

	}
//这里通过set注入,把配置文件中需要实例化的类传给该userDao。
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
}


 

    在U层读取该方法:

	public static void main(String[] args) {
			
		ApplicationContext factory = new ClassPathXmlApplicationContext("applicationContext.xml");
		
		UserManager userManager = (UserManager)factory.getBean("userManager");
		
		userManager.addUser("张三", "123");
	}


 

    最后,实现了两个数据库之间的完美切换。

 

评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值