什么是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博大精深。