简介
创立于 2003年 ,
是为了解决企业级开发的复杂性的!
是一个分层的se/ee(javase和java ee)一站式轻量级开源框架
体系结构
Spring 有可能成为所有企业应用程序的一站式服务点,然而,Spring 是模块化的,允许你挑选和选择适用于你的模块,不必要把剩余部分也引入。下面的部分对在 Spring 框架中所有可用的模块给出了详细的介绍。
Spring 框架提供约 20 个模块,可以根据应用程序的要求来使用。
核心容器
核心容器由核心,Bean,上下文和表达式语言模块组成,它们的细节如下:
核心模块提供了框架的基本组成部分,包括 IoC 和依赖注入功能。
Bean模块提供 BeanFactory,它是一个工厂模式的复杂实现。
上下文模块建立在由核心和 Bean 模块提供的坚实基础上,它是访问定义和配置的任何对象的媒介。ApplicationContext 接口是上下文模块的重点。
表达式语言模块在运行时提供了查询和操作一个对象图的强大的表达式语言。
数据访问/集成
数据访问/集成层包括 JDBC,ORM,OXM,JMS 和事务处理模块,它们的细节如下:
JDBC模块提供了删除冗余的 JDBC 相关编码的 JDBC 抽象层。
ORM模块为流行的对象关系映射 API,包括 JPA,JDO,Hibernate 和 iBatis,提供了集成层。
OXM模块提供了抽象层,它支持对 JAXB,Castor,XMLBeans,JiBX 和 XStream 的对象/XML 映射实现。
Java 消息服务JMS模块包含生产和消费的信息的功能。
事务模块为实现特殊接口的类及所有的 POJO 支持编程式和声明式事务管理。
Web
Web 层由 Web,Web-MVC,Web-Socket 和 Web-Portlet 组成,它们的细节如下:
Web模块提供了基本的面向 web 的集成功能,例如多个文件上传的功能和使用 servlet 监听器和面向 web 应用程序的上下文来初始化 IoC 容器。
Web-MVC模块包含 Spring 的模型-视图-控制器(MVC),实现了 web 应用程序。
Web-Socket模块为 WebSocket-based 提供了支持,而且在 web 应用程序中提供了客户端和服务器端之间通信的两种方式。
Web-Portlet模块提供了在 portlet 环境中实现 MVC,并且反映了 Web-Servlet 模块的功能。
其他
还有其他一些重要的模块,像 AOP,Aspects,Instrumentation,Web 和测试模块,它们的细节如下:
AOP模块提供了面向方面的编程实现,允许你定义方法拦截器和切入点对代码进行干净地解耦,它实现了应该分离的功能。
Aspects模块提供了与AspectJ的集成,这是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation模块在一定的应用服务器中提供了类 instrumentation 的支持和类加载器的实现。
Messaging模块为 STOMP 提供了支持作为在应用程序中 WebSocket 子协议的使用。它也支持一个注解编程模型,它是为了选路和处理来自 WebSocket 客户端的 STOMP 信息。
测试模块支持对具有 JUnit 或 TestNG 框架的 Spring 组件的测试。
作用:
1.Spring是一个开元的轻量级的应用开发框架,其目的是用于简化企业级应用程序开发,减少侵入;
2.Spring的IOC和AOP应用,将组件的耦合度降至最低,即解耦,便于系统的维护和升级;
3.可以与第三方框架和技术整合应用,可以自由选择技术进行开发。
Spring提供许多功能,在此我将快速地依次展示其各个主要方面。
首先,让我们明确Spring范围。尽管Spring覆盖了许多方面,但我们已经有清楚的概念,它什么应该涉及和什么不应该涉及。
Spring的主要目的是使JavaEE易用和促进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有分布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供O/R mapping层,对此,已有友好的解决办法如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。
例如,尽管我们没有底层事务协调处理,但我们提供了一个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的一些东西。例如,像许多开发人员,我们从来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已经较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的一致性。
所有的开发者都在唱同样的的赞歌,基础想法依然是Expert One-on-One J2EE设计与开发的那些。
并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个领域。
Spring在应用服务器之间是可移植的。
当然保证可移植性总是一次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的应用服务器上的用户。
注解方式:
a)@Component 为通用注解
b)@Repository 为持久层组件注解
c)@Service 为业务层组件注解
d)@Controller 为控制层注解
e)@Scope 为Bean的作用域注解
f)@Autowired 为指定Bean之间依赖关系的注解
g)@Inject 为指定Bean之间依赖关系的注解
h)@Value 为注入Spring表达式值的注解
j)@ResponseBody 为Ajax返回类型的注解
工作流程
同步请求与响应处理(普通浏览器请求,整个页面刷新)
异步请求与响应处理(Ajax请求,页面局部刷新)
spring功能的作用
IOC:控制反转(获取方式发生反转,由最初new方式创建, 转为由框架创建、注入,这样可以降低对象 之间的耦合度。)
AOP:面向切编程(是一种编程思想,将系统中非核心的业务提取出来,进行单独处理)
WebMVC:MVC结构的实现、与其他 Web技术整合(m模型v视图c控制)
DAO:与 JDBC整合和事务管理 (整合JDBC提供了封装,简化了DAO组件的编写)
ORM:与 ORM 框架整合
springMVC实现,主要实现组件如下
DispatcherServlet (控制器, 请求入口)
HandlerMapping (控制器, 请求派发)
Controller (控制器, 请求处理流程)
ModelAndView (模型, 封装处理结果和视图)
ViewResolver(视图, 视图显示处理器)
Spring的AOP和IOC在项目中都是为了解决系统代码耦合度过高的问题。使代码重用度高、易于维护。比如事务、日志和安全等。
IoC的概念
IoC,Inversion of Control,控制反转。
对象的协作关系由对象自己负责。
依赖注入:对象的协作关系有容器来建立。
IOC的类型
(1) 基于特定接口(侵入式方案)
(2) 基于set方法
(3) 基于构造器
Spring容器
Spring容器负责生成、组装、销毁组件,并负责事件处理等功能。
(1) BeanFactory
① 核心容器,负责组件生成和装配
② 实现主要包括Xml BeanFactory123
(2) ApplicationContext
(3) WebApplicationContext
(4) ……
IoC的使用
Resource:interface,用来包装资源
xmlBeanFactory:BeanFactory的一个实现,使用Resource对象来查找配置文件
BeanFactory.gerBean(“BeanId”):取得以参数命名,或者Id等于参数值的一个Bean实例。
BeanFactory(容器)在默认情况下,会采用单例方式返回对象。容器只到调用getBean方法时,才会实例化某个对象。
(1) Spring可以采用XML或者.properties文件作配置
(2) 配置文件(XML)
根元素可以有多个子元素,每个代表一个需要装配的对象。
1、setter注入
(1) 注入简单属性
parameterValue
对于基本类型,Spring容器会自动作类型转换,以便赋值。
(2) 注入对象
A、让Spring容器在当前配置文件中找到相应的Bean,并调用set方法,注入该Bean。
B、将一个Bean的定义嵌套在另一个Bean中(可读性差),被嵌套的Bean不能采用getBean()返回
C、采用搜索多个配置文件来注入
(3) 注入集合类型
① Set
Set中存放字符串,对象,集合,不允许重复
② List
List中可以放入字符串,对象,List
③ Map
Map 有子元素来存取key,value,key只能为String
④ Properties
Properties有子元素
spring的AOP
AOP从运行的角度考虑程序的流程,提取业务处理过程的切面。
将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。
Aspect Oriented Programming 面向方面编程(面向切面编程) 以切面为核心编程/找切面、追加共通逻辑/掌握应用
Object Oriented Programming 面向对象编程 以对象为核心编程/类设计/设计原则或模式
AOP还是已OOP为基础,只不过是将共通逻辑单独封装成组件,然后通过配置将组件动态切入到原有组件方法中。
优点:可以在不修改原有组件功能代码情况下,扩充组件功能,对共通需求和传统业务需求进行解耦。
AOP使用
将程序中的交叉业务逻辑提取出来,称之为切面。将这些切面动态织入到目标对象,然后生成一个代理对象的过程。
1. 切面组件(加什么功能?)Aspect
在组件中寻找共通位置和时机,将追加功能切入到原有组件中。追加的功能组件一般被称为切面组件。
2. 切入点(给谁加?)Pointcut
切入点用于指定切入目标组件或方法。Spring提供了多种表达式
方法限定表达式
execution(修饰符? 返回类型 方法名(参数列表) 抛出异常?)
//所有以find开头的方法要被切入追加功能 execution(* find*(..))
//DeptService类中所有方法要切入追加功能 execution(*
cn.xdl.service.DeptService.*(..)) //cn.xdl.service包下所有类所有方法
execution(* cn.xdl.service..(..)) //cn.xdl.service包及子包下所有类所有方法
execution(* cn.xdl.service...(..))
类型限定表达式
within(类型)
//DeptService组件所有方法要被切入追加功能 within(cn.xdl.service.DeptService)
//cn.xdl.service包下所有类所有方法 within(cn.xdl.service.*)
//cn.xdl.service包及子包下所有类所有方法 within(cn.xdl.service..*)
Bean名称限定表达式
bean(Spring容器中组件的id名)
//id=deptService组件的所有方法 bean(deptService) //id以Service结尾的组件的所有方法
bean(*Service)
AOP核心概念
1、Aspect(切面)—切面,是对交叉业务逻辑的统称。
2、Joinpoint(连接点)—连接点,指切面可以织入到目标对象的位置(方法,属性等)。
3、Advice(通知)—通知,指切面的具体实现。
4、Pointcut(切入点)—切入点,指通知应用到哪些类的哪些方法或属性之上的规则。
5、Introduction(引入)—引入,指动态地给一个对象增加方法或属性的一种特殊的通知。
6、Weaving(织入)—织入,指将通知插入到目标对象。
7、Target(目标对象)—目标对象,指需要织入切面的对象。
8、Proxy(代理对象)—代理对象,指切面织入目标对象之后形成的对象。
通知(什么时候加?)Advice
通知用于决定切面组件追加的时机,例如在原有组件方法前、方法后、抛出异常之后等。
try{
//追加逻辑–》前置通知
//原有组件的方法
//追加逻辑–》后置通知 }catch(){
//追加逻辑–》异常通知 }finally{
//追加逻辑–》最终通知
}
环绕通知:等价于前置+后置综合效果
AOP案例1
要求:在调用DeptDao每个方法之前,都要打印一个消息”进入DeptDao执行处理”
1. 分析
切面组件:LoggerBean方法,在方法中追加功能逻辑
通知:使用前置通知
切入点:DeptDao组件所有方法
within(cn.xdl.dao.JdbcDeptDao)
2. 编写切面组件
public class LoggerBean {
//前置通知方法 public void mybefore(){
System.out.println("进入了DeptDao组件方法执行处理"); } }1234
3. AOP XML 配置
AOP配置
1
在切面组件中追加注解标记
@Component//等价于定义 @Aspect//等价于定义 public class LoggerBean { //前置通知方法
@Before(“execution(* cn.xdl.dao.JdbcDeptDao.find*(..))”)//等价于
public void mybefore(){
System.out.println(“进入了DeptDao组件方法执行处理”);
}
}
AOP案例2
需求:为程序中处理组件追加性能监测日志,记录哪个方法执行了多长时间。
1. 分析
通知:采用环绕通知
切入点:程序中所有自定义组件 within(cn.xdl..*)
切面组件:计算出执行时间,记录到数据库或文件中
2. 编写切面组件
@Component
@Aspect
public class WatchBean {
@Around(“within(cn.xdl..*)”) public Object watch(ProceedingJoinPoint pjp) throws Throwable{
//加前置逻辑,在原有组件方法前调用
long begin = System.currentTimeMillis();
Object obj = pjp.proceed();//执行原有组件的方法
//加后置逻辑,在原有组件方法后调用
long end = System.currentTimeMillis();
long time = end-begin;//用时(毫秒)
//获取目标方法信息
String targetClass = pjp.getTarget().getClass().getName();//获取目标组件类型名
String methodName = pjp.getSignature().getName();//获取执行的目标方法名
System.out.println(targetClass+”类的”+methodName+”方法耗时”+time+”毫秒”);
return obj; }
}
3. AOP配置
追加@Component、@Aspect、@Around注解标记、@Aspect切面组件、@Around环绕
##AOP原理(动态代理技术)
当使用Spring AOP切入目标组件之后,从Spring容器再获取目标组件,容器返回的是一个动态生成的类型(代理类)对象,该代理类对象重写原有目标组件的方法,在重写方法中调用原有组件方法功能+切面组件的追加功能。
该技术被称为动态代理技术,Spring使用了下面两种:
目标组件有接口采用下面机制(JDK Proxy API)
创建一个新的组件,组件实现了原有接口,把所有方法完成
- 目标组件没有接口采用下面机制(CGLIB工具,推荐)
创建一个新的组件,组件继承了原有目标组件,把所有方法重写
- 可以在aop配置强制指定目标组件生成机制
强制Spring容器采用CGLIB方式生成目标组件的子类,重写目标组件方法。
请求转发/请求重定向
请求转发
return “forward:xx.do”;
请求重定向
return “redirect:xx.jsp”;
Spring的Bean有以下五种作用域:
1.singleton:SpringIoc容器只会创建该Bean的唯一实例;
2.prototype:每次请求都创建一个实例;
3.request:每次HTTP请求都会产生一个新的bean。
4.session :每次会话创建一个实例;
5.global session :全局的HttpSession中,容器会返回该bean的同一个实例。
事物拦截器的实现原理。
spring中的事务管理是通过AOP代理来实现的,对被代理对象的每个方法进行拦截,
在方法执行前启动事务,方法执行完后根据是否有异常和异常的种类进行提交或回滚。
spring相关jar包。
spring.jar是包含有完整发布的单个jar包,spring.jar中包含除了 spring-mock.jar里所包含的内容外其它所有jar包的内容,因为只有在开发环境下才会用到spring-mock.jar来进行辅助测试,正式应用系统中是用不得这些类的。
除了spring.jar文件,Spring还包括有其它13个独立的jar包,各自包含着对应的Spring组件,用户可以根据自己的需要来选择组合自己的jar包,而不必引入整个spring.jar的所有类文件。
(1) spring-core.jar
这个jar文件包含Spring框架基本的核心工具类,Spring其它组件要都要使用到这个包里的类,是其它组件的基本核心,当然你也可以在自己的应用系统中使用这些工具类。
(2) spring-beans.jar
这个jar文件是所有应用都要用到的,它包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类。如果应用只需基本的IoC/DI支持,引入spring-core.jar及spring- beans.jar文件就可以了。
(3) spring-aop.jar
这个jar文件包含在应用中使用Spring的 AOP特性时所需的类。使用基于AOP的Spring特性,如声明型事务管理(Declarative Transaction Management),也要在应用里包含这个jar包。
(4) spring-context.jar
这个jar文件为Spring核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、FreeMarker、JasperReports集成的类,以及校验Validation方面的相关类。
(5) spring-dao.jar
这个jar文件包含Spring DAO、Spring Transaction进行数据访问的所有类。为了使用声明型事务支持,还需在自己的应用里包含spring-aop.jar。
(6) spring-hibernate.jar
这个jar文件包含Spring对Hibernate 2及Hibernate 3进行封装的所有类。
(7) spring-jdbc.jar
这个jar文件包含对Spring对 JDBC数据访问进行封装的所有类。
(8) spring-orm.jar
这个jar文件包含Spring对 DAO特性集进行了扩展,使其支持 iBATIS、JDO、OJB、TopLink,因为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖 spring-dao.jar里的类,用这个包时你需要同时包含spring-dao.jar包。
(9) spring-remoting.jar
这个jar文件包含支持EJB、JMS、远程调用Remoting(RMI、 Hessian、Burlap、Http Invoker、JAX-RPC)方面的类。
(10) spring-support.jar
这个jar文件包含支持缓存Cache(ehcache)、JCA、JMX、邮件服务(Java Mail、COS Mail)、任务计划Scheduling(Timer、Quartz)方面的类。
(11) spring-web.jar
这个jar文件包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、 Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。
(12) spring-webmvc.jar
这个jar文件包含Spring MVC框架相关的所有类。包含国际化、标签、Theme、视图展现的FreeMarker、JasperReports、Tiles、Velocity、 XSLT相关类。当然,如果你的应用使用了独立的MVC框架,则无需这个JAR文件里的任何类。
(13) spring-mock.jar
这个jar文件包含Spring一整套mock类来辅助应用的测试。Spring测试套件使用了其中大量mock类,这样测试就更加简单。模拟HttpServletRequest和HttpServletResponse类在Web应用单元测试是很方便的。
如何选择这些发布包,决定选用哪些发布包其实相当简单。如果你正在构建Web应用并将全程使用Spring,那么最好就使用单个全部的 spring.jar文件;如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar与spring-beans.jar即可;如果你对发布的大小要求很高,那么就得精挑细选了,只取包含自己所需特性的jar文件了。采用独立的发布包你可以避免包含自己的应用不需要的全部类。当然你可以采用其它的一些工具来设法令整个应用包变小,节省空间的重点在于准确地找出自己所需的Spring依赖类,然后合并所需的类与包就可以了。Eclispe有个插件叫 ClassPath Helper可以帮你找找所依赖的类。
org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现
org.springframework.asm——spring 2.5.6的时候需要asm jar包,spring3.0开始提供它自己独立的asm jar包
org.springframework.aspects——Spring提供的对AspectJ框架的整合
org.springframework.beans——所有应用都用到,包含访问配置文件,创建和管理bean等,是Spring IOC的基础实现。
org.springframework.context.support——Spring context的扩展支持,用于MVC方面
org.springframework.context——提供在基础IOC功能上的扩展服务,此外还提供许多企业级服务的支持,有邮件服务、任务调度、JNDI定位,EJB集成、远程访问、缓存以及多种视图层框架的支持。
org.springframework.core——Spring的核心工具包,其他包依赖此包
org.springframework.expression——Spring表达式语言
org.springframework.instrument.tomcat——Spring对tomcat连接池的集成
org.springframework.instrument——Spring对服务器的代理接口
org.springframework.jdbc——对JDBC 的简单封装
org.springframework.jms——为简化jms api的使用而做的简单封装
org.springframework.orm——整合第三方的orm实现,如hibernate,ibatis,jdo以及spring 的jpa实现
org.springframework.oxm——Spring对于object/xml映射的支持,可以让JAVA与XML之间来回切换
org.springframework.test——对JUNIT等测试框架的简单封装
org.springframework.transaction——为JDBC,HIBERNATE,JDO和JPA提供的一致性的声明式和简单编程式事务管理
org.springframework.web.portlet——Spring MVC的增强
org.springframework.web.servlet——对J2EE6.0 servlet3.0的支持
org.springframework.web.struts——整合struts框架的支持,可以更方便更容易的集成Struts框架。
org.springframework.web——包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。
Spring包依赖说明:
1) spring-core.jar需commons-collections.jar,spring-core.jar是以下其它各个的基本。
2) spring-beans.jar需spring-core.jar,cglib-nodep-2.1_3.jar
3) spring-aop.jar需spring-core.jar,spring-beans.jar,cglib-nodep-2.1_3.jar,aopalliance.jar
4) spring-context.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,commons-collections.jar,aopalliance.jar
5) spring-dao.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring-context.jar
6) spring-jdbc.jar需spring-core.jar,spring-beans.jar,spring-dao.jar
7) spring-web.jar需spring-core.jar,spring-beans.jar,spring-context.jar
8) spring-webmvc.jar需spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar
9) spring -hibernate.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-orm.jar,spring-web.jar,spring-webmvc.jar
10) spring-orm.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-jdbc.jar,spring-web.jar,spring-webmvc.jar
11) spring -remoting.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring- dao.jar,spring-context.jar,spring-web.jar,spring-webmvc.jar
12) spring-support.jar需spring-core.jar,spring-beans.jar,spring-aop.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar
13) spring-mock.jar需spring-core.jar,spring-beans.jar,spring-dao.jar,spring-context.jar,spring-jdbc.jar
spring的特点与好处
特点
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可以给一个工程带来的一些好处:
Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其他的包含了J2EE特有API的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了系统的可测试性和面向对象特性。
Spring能消除使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。倒置控制的使用(在下面讨论)帮助完成这种简化。
Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。
Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs。在Spring应用中的大多数业务对象没有依赖于Spring。
使用Spring构建的应用程序易于单元测试。
Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
Spring帮助你解决许多问题而无需使用EJB。Spring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。
Spring为数据存取提供了一致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有如下优点:
1.低侵入式设计,代码污染极低
2.独立于各种应用服务器,基于Spring框架的应用,可以真正实现Write Once,Run Anywhere的承诺
3.Spring的DI机制降低了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部
网友评论