`
aben328
  • 浏览: 1457167 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类

探讨Spring框架使用真相 [转]

阅读更多

探讨Spring框架使用真相

  最近,Spring很热闹,因为实现IoC模式和AOP(见本站专栏),然后又成立公司,吸取上次JBoss的教训,文档不敢收费,结果迎来了一片祝贺声。

  Spring真正的精华是它的Ioc模式实现的BeanFactory和AOP,它自己在这个基础上延伸的功能有些画蛇添足。

  其实说白了,大家"惊奇"的是它的IoC模式(使用AOP功能需要了解AOP,比较难),那么,Spring之类的Ioc模式是什么? 就是:你在编制程序时,只要写被调用者的接口代码,具体子类实例可通过配置实现。

  Ioc模式是什么知道的人不多,但是,当他知道生成对象不用再使用new了,只要在配置文件里配置一下,他感到新鲜,其实这就是Ioc模式的实现,PicoContainer是另外一种真正轻量的Ioc模式实现,PicoContainer还是采取代码将对象注射一个小容器中,而Spring采取配置文件。

  配置式编码其实有利有弊,编码本来可通过开发工具或编译器检查错误,但是过分依赖配置时,就会经常出现因为粗心导致的小错误,如果调试程序出错经常是因为配置文件中小写字母写成大写字母,不知道你是怎么心情?

  Spring最近还发表了Spring without EJB的书,这倒是说了实话,Spring和EJB其实是相竞争,如同黑与白,如果硬是将两者搭配使用,显得不协调,更不是一些人所谓优化EJB调用的谣言,原因下面将会分析。既然Spring+EJB有缺陷,那么就直接使用Spring+Hibernate架构,但是又带来了新问题:无集群分布式计算性能,只能在一台机器上运行啊,具体分析见:可伸缩性和重/轻量,谁是实用系统的架构主选?

  下面来分析所谓Spring+EJB的不协调性,正如水和油搅拌在一起使用一样。
  目前,Spring+EJB有两种应用方式:

  1. Spring不介入EJB容器,只做Web与EJB之间的接口,这个位置比较尴尬,Web层直接调用EJB的方法比较直接快捷,为什么要中间加个Spring?可实现Web缓存?使用性能更好的AOP框架aspectwerkz啊;实现Web和EJB解耦?这样的工具更多,自己都可以做个小框架实现,就不必打扰背着AOP和IOC双重重担的Spring了吧。

  2. Spring介入EJB容器,这时,需要在你的ejb-jar.xml中配置beanFactoryPath值指向你为EJB配置的applicationContext.xml,那么你的EJB还需要继承Spring的SimpleRemoteStatelessSessionProxyFactoryBean。

  好了,现在你的SLSB(无状态Session Bean)成为下面这个样子:

  void updateUser(){
    
      myService.updateUser(); //委托给一个POJO的方法,真正业务逻辑封装在这个POJO中

  }

  这样做有很多“优点”,当然最大“优点”是:

  由于真正业务核心在POJO中实现,因此,只要改一下applicationContext.xml配置,这样,调试时,前台就可以直接调用POJO,不必通过EJB,调试起来方便了,这有一个前提:他们认为调试EJB复杂,其实不然,在JBuilder中,结合Junit,测试EJB如同测试POJO一样方便,这是其他分支,不在此讨论。当部署使用时,再改一下applicationContext.xml配置,指引前台调用到EJB。

  似乎很巧妙,这里有两个疑问,首先,指引到EJB的改变是什么时候做?持续集成前还是后,在前在后都有问题,这里不仔细分析。

  这种表面巧妙的优点带来最大的问题是:粗粒度事务机制。所谓粗粒度事务机制,最早见于Petstore的WEB调用EJB Command模式,在这个帖子中有讨论。

  下面以代码描述什么是粗粒度事务机制:

  ejb方法:
  public void updateUser(){
    service.updateUser();
  }

  service是一个POJO,具体方法可能是更新两个表:
  public void updateUser(){
    updateTabel1();//更新table1
    updateTable2(); //更新table2
  }

  当updateTable2()抛出异常,updateTable1()是不回滚的。这样,table1中就有一条错误的多余的记录,而table2则没有这条记录。

  那么,怎么做才能使两个表记录一致,采取事务机制,只有下面这样书写才能实现真正事务:
在EJB方法中写两个方法,因为EJB方法体缺省是一个事务。
  public void updateUser(){
    updateTabel1();//更新table1
    updateTable2(); //更新table2
  }

  关于EJB自动的事务机制,最近也有一个道友做了测试,对于JBoss中容器管理的事务的疑惑。

  如果你从事关键事务,就是带money相关操作的事务,这种粗粒度机制可能害苦你,那么,似乎有一种办法可弥补事务,不使用EJB容器事务(CMT),在service中使用Spring的事务机制。

  如果使用Spring事务机制,业务核心又在POJO中实现,那么我有一个疑问:还要套上EJB干什么?至此,你终于明白,Spring本质是和EJB竞争的,如果硬套上EJB使用,只是相借助其集群分布式功能,而这个正是Spring目前所缺少的。

  我太惊异Spring精巧的诡异了,他和EJB关系,正如异型和人的关系一样。

  为了避免你每次使用Spring时想到粘糊糊的异型,不如Spring without EJB,这也正是Spring的初衷,也是它的一个畅销书名。

  为让初学者更容易掌握Spring,在本站教学区新增一篇“Spring入门速成”,简单易懂,专门针对VIP会员的。

分享到:
评论

相关推荐

    Spring框架.ppt

    提供Spring框架的基本功能,其主要组件是BeanFactory,是工厂模式的实现。 Spring 上下文。向Spring 框架提供上下文信息,包括企业服务,如 JNDI、EJB、电子邮件、国际化、校验和调度等。 Spring AOP。通过配置管理...

    spring框架,技术详解及使用指导

    本文将深入探讨Spring框架的核心概念、主要模块以及如何在实际项目中应用。 一、Spring框架核心概念 1. **依赖注入(Dependency Injection,DI)**:Spring通过DI来管理对象之间的依赖关系,使得代码更加松耦合,...

    spring框架技术详解及使用指导

    本篇文章将深入探讨Spring框架的核心概念、主要功能以及如何在实际项目中进行有效利用。 一、Spring框架概述 Spring框架由Rod Johnson于2003年创建,其设计理念是通过依赖注入(Dependency Injection, DI)和面向切...

    spring框架外文文献.docx

    具体来说,我们将探讨Spring框架如何帮助我们实现依赖注入,以及如何利用编程来提高效率。为了做到这一点,我们将探索控制反转(IoC)容器,即应用程序上下文。 在这里,我们只触及Spring框架的基本概念。如果你想...

    基于Spring的web框架使用说明

    本指南将深入探讨如何在Web开发中利用Spring框架,以及如何通过其核心特性提升开发效率。 1. **Spring概述** Spring是一个全面的后端开发框架,它提供了从数据访问到事务管理,再到Web应用的一整套解决方案。其...

    Spring框架的简单实现

    我们从一个简单的容器开始,一步步的重构,最后实现一个基本的Spring框架的雏形,为了帮助我们更加深入的理解Spring的IoC的原理和源码。 详细内容见博文: 【SSH进阶之路】一步步重构容器实现Spring框架——从一个...

    spring框架api中文版.zip(spring开发手册)

    即Spring框架的概述 1。 介绍Spring框架 1.1。 依赖注入和控制反转 1.2。 模块 1.2.1。 核心容器 1.2.2。 数据访问/集成 1.2.3。 web 1.2.4。 AOP和仪表 1 2 5。 测试 1.3。 使用场景 1.3.1。 依赖关系管理和命名...

    spring框架学习笔记

    本笔记将深入探讨Spring框架的核心概念和主要功能,帮助你全面理解并掌握这一强大的工具。 一、Spring概述 Spring是一个开源的Java平台,它提供了一个全面的编程和配置模型,用于现代Java应用。其核心是IoC容器,...

    java spring框架学习资料 pdf

    《Java Spring框架学习指南》是一份详尽的教育资源,旨在帮助开发者从零基础开始逐步掌握Spring框架,并深入理解其核心概念和技术。这份PDF文档全面覆盖了Spring框架的基础知识,包括IoC(Inversion of Control)...

    Spring框架学习笔记

    Spring框架是Java开发中广泛应用的轻量级...这份"Spring框架学习笔记"会深入探讨以上各个知识点,通过PDF文档的形式,提供详细的讲解和实例,对于想要深入了解和学习Spring框架的人来说,无疑是一份实用的学习资源。

    spring框架jar包

    让我们深入探讨一下Spring框架的关键组件和它们在Java开发中的作用。 首先,Spring的核心组件包括IoC(Inversion of Control,控制反转)容器和AOP(Aspect-Oriented Programming,面向切面编程)。IoC容器是Spring...

    Spring框架web项目实战全代码分享

    在本篇【Spring框架web项目实战全代码分享】中,我们将深入探讨如何使用Spring框架构建一个Java Web项目。首先,我们需要了解Spring的核心概念,它是一个轻量级的、全面的开源框架,主要用于简化企业级应用的开发。...

    Spring框架原理及详细搭建步骤

    此外,Spring对主流的ORM框架也提供了集成支持,开发者可以利用Spring ORM模块轻松地与Hibernate、MyBatis等ORM框架结合使用。 在Web层,Spring提供了自己的MVC框架——SpringMVC,它是一种基于Java的实现了MVC设计...

    J2EE项目实训Spring框架技术

    在本J2EE项目实训中,我们将深入探讨Spring框架的核心技术和应用。Spring是Java企业级应用开发中的一个关键组件,它提供了一整套强大的服务,包括依赖注入(DI)、面向切面编程(AOP)、数据访问、事务管理、Web MVC...

    Spring框架的设计原理及设计模式分析

    Spring 框架的设计目标是让对象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。这个注入关系在一个叫 Ioc 容器中管理,那 Ioc 容器中有又是什么就是被 Bean 包裹的对象。Spring 正是通过把对象包装在...

    传智播客_Spring 2016框架视频

    根据提供的文件信息,我们可以深入探讨Spring框架的相关知识点。尽管标题和描述相对简略,但从“传智播客_Spring 2016框架视频”这一信息来看,这应该是关于Spring框架的教学视频。接下来,我们将围绕Spring框架的...

    Spring框架研究与探讨

    本文将深入探讨Spring框架中的两个重要特性:面向切面编程(AOP)及事务管理,并通过实例解释这两种技术如何协同工作以提高软件质量。 #### AOP思想与面向方面的编程 面向切面编程(Aspect-Oriented Programming, ...

    spring框架电子书

    Spring框架是中国Java开发领域中最广泛使用的轻量级框架之一,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了企业级应用的开发。...

    spring框架.ppt

    - WEB:这一模块为其他MVC框架(如Struts、Webwork等)提供支持,增强了Spring在Web环境中的使用能力。 2. Spring IoC容器: - IoC(Inversion of Control,控制反转)是Spring的核心特性,它通过反转对象创建和...

Global site tag (gtag.js) - Google Analytics