spring ioc

什么是spring

Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库,逐渐成为使用最多Java EE企业应用开源框架。

为什么使用spring

早期使用的是EJB,而EJB开始的学习和应用非常的艰苦,很多东西都不能一下子就很容易的理解。EJB要严格地实现各种不同类型的接口,类似的或者重复的代码大量存在。而配置也是复杂和单调,同样使用JNDI进行对象查找的代码也是单调而枯燥。并且学习EJB的高昂代价,和极低的开发效率,极高的资源消耗,都造成了EJB的使用困难。而Spring出现的初衷就是为了解决类似的这些问题。
Spring不仅自己提供三层架构的解决方案,实现一站式框架,也能与其他优秀框架如Hibernate、Mybatis、Struts2等实现轻松整合,灵活性高。

spring的IOC

IoC(Inverse Of Control:反转控制)
控制反转说的就是把对象的创建从自己控制反转交给spring管理,使用者仅需把自己需要用到的对象告知spring(配置xml方式或注解方式),然后就可以直接声明使用(符合spring的规范,比如用注解方式注入@AutoWrite或者一样在xml文件中配置),而不用自己在代码中创建对象,消除了硬编码,降低了类之间的依赖关系。简单的说,就是告知spring自己要用到的对象,spring把这些对象创建准备好,等你要用到的时候直接向spring拿就行,IOC就像是一个存放了对象的容器。

spring IOC有什么特点

为什么要将对象交由spring管理呢?其实spring还做了其他的一些事。那么spring是怎么创建对象的,在这里先举个例子:比如我们若使用MySQL数据库时,在代码中我们可能会这样写

public static void main(String[] args) throws Exception{
		//1.注册驱动 
	    Class.forName("com.mysql.jdbc.Driver");
	    //2.获取连接 
	    //3.获取预处理sql语句对象 
	    //4.获取结果集 
	    //5.遍历结果集 
	}

也可以这样写

public static void main(String[] args) throws Exception{
		//1.注册驱动 
		DriverManager.registerDriver(new com.mysql.jdbc.Driver());
	    //2.获取连接 
	    //3.获取预处理sql语句对象 
	    //4.获取结果集 
	    //5.遍历结果集 
	}

我们不难看出二者的差别,前者是通过反射的方式创建对象并注册驱动,后者直接创建对象并注册驱动,而且反射所需的只是一个字符串,而new需要的是存在此类否则无法编译成功。

同时为了保持系统的灵活性,我们需要考虑日后可能会因为某方面的原因而更换数据库,比如从原来的MySQL换为Oracle那么如果按照上面连接数据库的两种方式,都需要去修改源代码,这无疑是不可取的。但是对于反射的方式,可以将字符串提取到配置文件中如properties文件或者xml文件等,在代码中使用文件读取工具将其读出,这样达到一样的效果也降低了程序的耦合度,当更换数据库时,仅需修改配置文件即可而不用修改代码,使代码更具通用性。而第二种方式则只能修改源代码,只修改一处代码还容易,但是代码量往往是庞大的,当程序内的耦合度很高,到处都是类与类之间的依赖,修改起来可就太浪费时间与精力了。

Spring底层正是做了这样的工作,当你使用spring框架时,你会以注解或者配置文件方式将对象交由spring管理,也就是将对象所属的类的全限定类名告诉spring,它就可以通过工厂模式用反射创建所有已配置的对象,并且可拿出来使用,从而削减计算机程序的耦合(解除我们代码中的依赖关系)。

原来我们获取对象是这样的
在这里插入图片描述
交由spring控制后
在这里插入图片描述
这就是笔者对spring ioc的理解,可能还有点浅显,毕竟spring博大精深。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值