深入理解 Spring 核心技术01 ---IOC容器概述

16 篇文章 1 订阅
9 篇文章 0 订阅

相信大家都知道Spring是一个轻量级的Java开发框架,近年来一直都是Java开发中最受欢迎的框架之一。今天就和大家来介绍一下spring框架。
提到spring就不得而不提到一个人,叫做Rod Johnson,这位技术大牛就是spring框架的创始人。在早些年,随着技术的发展,企业级应用程序变得越来越复杂,为了全面应对各种复杂的需求JavaEE开发的规范也越来越庞大,而其核心的EJB规范由于自身的一下缺陷受到了开发者大量的吐槽,这时各种民间的高手都在开发自己的框架,试图取代EJB。而最成功的就是现在的spring。
说到这里可能有的小伙伴有点好奇EJB是什么鬼,这里解释一下,EJB就是企业级JavaBean,由sun公司提出的一套JavaEE企业级应用的解决方案,不过很可惜,它是属于重量级的框架,因此受到很多开发者的诟病。好了,关于spring的起源先聊到这里,下面我们来看看spring到底有什么好处。
大家都知道传统的JavaEE应用开发效率比较低,而且应用服务器厂商对各种技术的支持并没有做到完全统一,从而导致JavaEE程序并没有实现“write Once,Run Anywhere”的承诺,而这个时候spring出现了,作为一个中间件,他是独立于各种应用服务器甚至不需要应用服务器的支持,也能提供应用服务器的功能。因此可以说spring就是为了简化开发而出现的。Rod Johnson也说过spring就是为了解决企业级应用开发的复杂性而存在的。
说了这么多现在进入正题,spring的好处就是简化应用开发,那么他是怎么实现简化开发的呢?
说到这里就不得不提一下程序的耦合的概念,相信大家都知道软件开发的过程中有一条很重要的原则,就是要降低程序代码之间的耦合,那么到底什么是程序的耦合呢。
来看下面这段代码:

		Class.forName("com.mysql.jdbc.Driver");
		Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/spring", "root", "1234");
		PreparedStatement pstm = conn.prepareStatement("select * from cst_customer");
		ResultSet rs = pstm.executeQuery();
		while(rs.next()){
			System.out.println(rs.getString("cust_name"));
		}
		rs.close();
		pstm.close();
		conn.close();

上述这段代码就是通过原生的JDBC连接数据库的一段代码,这里我们是以MySQL为例的,加入在开发中我们更换了数据库的品牌,那么我们就必须要重新在写这段代码了。原因是这里的一段代码对mysql的驱动包产生了依赖,而这种依赖就可以理解成是一种程序的耦合。
同样的,我们在开发中会写到很多类,而有些类和类之间不可避免的产生了依赖关系,这种依赖关系就是耦合。程序之间的耦合从某种意义上来说是不可避免的,因为一个项目运行必须要依赖于运行环境,对于运行期间我们是没有办法的,也不可能解除耦合。但是对于某些编译期的耦合我们是可以通过代码来进行解除的,
看下面的这段代码:

public class Service {
	//创建持久层对象
	private Dao dao = new Dao();
	
	 public Integer getDate() {
		 return dao.getDate();
	 }
}

上述代码中service中需要使用dao的功能,因此就需要创建dao的实例。这个时候我们就可以说Service类依赖于Dao类,你可以想象一下,假如在公司里你是负责Service层的设计,另外一个人负责Dao层的设计,如果负责Dao层的人没有完成任务,那么你还能继续正常的编写 单元测试吗,由此可见,程序之间的耦合是件很头疼的事。为了解决这个问题,Spring就登场了!
终于步入正题了,看下面这张图:
这里写图片描述
上图中大家可以看到应用程序需要的对象资源是由工厂提供的,而不是通过new的方式,因此就可以避免造成层与层之间的耦合,解释一下,工厂大家可以理解成负责帮我们从容器中获取一个对象的类,于是这样的话我们获取对象的方式就发生了改变,
以前我们获取对象需要自己new,但是现在有工厂为我们提供对象,
这种方式获取对象的思想就叫控制反转,Inversion Of Control ,简称IOC
他是spring框架的和核心之一,这样做的目的就是削减程序之间的耦合!
下面通过一个小案例来看看spring是怎么解决耦合的问题吧
打开eclipse,创建一个javaProject目录结构如下图所示:
这里写图片描述
如上图所示,在类路径下创建一个bean的xml文件,同时我们需要在lib路径下把spring框架所需要的jar包导入到项目中。根据三层架构的规范创建包。创建好了如下图所示:
这里写图片描述
关于这些jar包的作用后面会逐步给大家讲解,我们先来打开bean.xml文件,将下面的内容写入其中:

<?xml version="1.0" encoding="UTF-8"?>
ns xmlns="http://www.springframework.org/schema/beans"
		xmlns:p="http://www.springframework.org/schema/p"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
      					 http://www.springframework.org/schema/beans/spring-beans.xsd">
      	
      	<!-- 配置Servicce 和DAO -->				 
      	<bean id="customerDao" class="wcan.dao.impl.CustomerDaoImpl"/>    
      	<bean id="customerService" class="wcan.service.impl.CustomerServiceImpl"/>
      	
      	
</beans>

完成这一步后,大家再按照下图来创建类和接口:

这里写图片描述
注意,只需要创建类和接口就可以了,不需要些其他的功能代码,创建完成后,我们来打开web包下的Client类,在该类中添加如下代码:

public class Client {
	@Test
	public void TestSpringDemo() {
		//使用applicationContext接口
		ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
		//根据bean的id获取对象
		ICustomerService ics = (ICustomerService)ac.getBean("customerService");
		System.out.println(ics);
		ICustomerDao cd = (ICustomerDao) ac.getBean("customerDao");
		System.out.println(cd);

	}
}

这时当我们运行这个测试类的时候就会得到如下结果:
这里写图片描述

可以发现我们没用new关键字就可以获取到service层和dao层的对象,这就是spring框架带来的好处,那么问题来了,spring是怎么创建的对象呢?/
我们回到bean.xml文件中,仔细看这段代码:

	<!-- 配置Servicce 和DAO -->				 
      	<bean id="customerDao" class="wcan.dao.impl.CustomerDaoImpl"/>    
      	<bean id="customerService" class="wcan.service.impl.CustomerServiceImpl"/>

可以看到bean标签有个id属性和class属性,id属性的作用是给bean一个标识,class属性用于指定具体的类名。
再来回到client类中,
这里写图片描述
上述图中通过ClassPathXmlApplicationContext从类路径下加载一个bean.xml的配置文件,根据bean.xml文件中配置的id属性和class属性来创建对象,最后将对象的地址打印出来。
到这里可能你还是一头雾水,其实所谓控制反转就是说,我们在使用spring框架的时候我们不需要自己去创建对象,创建对象这件事从我们这里转移到容器帮我们创建,因此我们只需要集中精力开发自己的业务功能模块,而不需要处理复杂的对象和对象之间的关系
于是就可以很大程度上节省开发的时间,提高开发的效率。所以就有了spring框架能够提高程序开发的效率之说。
好了,聊到了这里相信大家对IOc有了一定的认识了把,下一篇小风给大家介绍Spring框架中的另外一个核心部分----Aop
emmmmmm…睡了,狗命要紧

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值