什么是Spring:
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。
Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。
简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
特点:
1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。有了Spring,用户不必再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的应用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几乎所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.降低Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了一个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为降低。
7.Java 源码是经典学习范例
Spring的源码设计精妙、结构清晰、匠心独运,处处体现着大师对Java设计模式灵活运用以及对Java技术的高深造诣。Spring框架源码无疑是Java技术的最佳实践范例。如果想在短时间内迅速提高自己的Java技术水平和应用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。
Spring的两大核心技术:
- 控制反转(IOC:Inversion of Control)/依赖注入(DI:Dependency Injection)
- 面向切面编程(AOP:Aspect Oriented Programming)
控制反转:
什么是IOC:这么讲吧,一个系统的运作肯定不是简单的几个类就可以实现的,它 往往需要多个类的合作来实现业务逻辑。这就使得每个对象都需要与其合作的对象具有 相互的关系(依赖关系)。在早前编程中所需要的依赖对象是通过自身去创建得到的, 而现在是通过一个容器来统一管理这些依赖关系。在这整个过程中,对象获得其他对象 引用的方式其实就是IOC。
IOC的本质:控制权的转移。IoC原理是基于面向对象中的设计原则的Don't call us,we'll call you(别找我,我会来找你的)。可以这样讲,所有组件的初始化和调用都是由容器负责。在传统实现中类之间的关系是由类自己控制的(需要使用其他类时就自己创建),但是在IoC中,组件处在容器中,由容器统一管理和调度。这就是"控制反转"的概念所在:控制权由应用代码转移到了容器中,即控制权的转移。
依赖注入:
依赖注入的本质:上面说到控制反转IOC,是一个思想概念,但是也要具体实现的,上面的配置文件也是一种实现方式。依赖注入提出了具体的思想。
依赖注入DI是Dependency Injection缩写,它提出了“哪些东东的控制权被反转了,被转移了?”,它也给出了答案:“依赖对象的创建获得被反转”。所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
面向切面编程:
面向切面编程的本质:面向切面编程,指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。
1主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
2主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
Spring的优点:
1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
Spring容器:
Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。
BeanFactory 支持两个对象模型。
1、单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton是默认的也是最常用的对象模型。对于无状态服务对象很理想。
2、原型模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。
bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。
墨盒练习:
创建一个墨盒接口
package cn.spring.ink; public interface ink { public String getInk(); }
实现墨盒接口(彩色和黑白):
实现彩色墨盒 package cn.spring.ink; public class color implements ink{ @Override public String getInk() { return "彩色"; } } 实现黑白墨盒 package cn.spring.ink; public class bw implements ink{ @Override public String getInk() { return "黑白"; } }
创建纸张接口:
package cn.spring.paper; public interface paper { public String getPaper(); }
实现纸张接口(A4,B5):
实现A4接口 package cn.spring.paper; public class A4 implements paper{ @Override public String getPaper() { return "A4"; } } 实现B5接口 package cn.spring.paper; public class B5 implements paper { @Override public String getPaper() { return "B5"; } }
创建一个打印机类:
package cn.spring.print; import cn.spring.ink.ink; import cn.spring.paper.paper; public class print { private ink ink; private paper paper; public cn.spring.ink.ink getInk() { return ink; } public void setInk(cn.spring.ink.ink ink) { this.ink = ink; } public cn.spring.paper.paper getPaper() { return paper; } public void setPaper(cn.spring.paper.paper paper) { this.paper = paper; } public void show(){ System.out.println("您使用的是"+ink.getInk()+"墨盒, 使用的是"+paper.getPaper()+"纸张。"); } }
在applicationcontextbean.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--注入bean id相当于当前bean唯一标识 class是bean 的全路径 property注入bean中的属性 必须封装 --> <bean id="colorInk" class="cn.spring.ink.color"></bean> <bean id="grayInk" class="cn.spring.ink.bw"></bean> <bean id="a4" class="cn.spring.paper.A4"></bean> <bean id="b5" class="cn.spring.paper.B5"></bean> <bean id="printer" class="cn.spring.print.print"> <property name="ink" ref="colorInk"></property> <property name="paper" ref="a4"></property> </bean> </beans>
测试:
package cn.spring.test; import cn.spring.print.print; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class printtest { @Test public void test(){ ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontextbean.xml"); print bean = (print)context.getBean("printer"); bean.show(); } }