精通Spring2.0读书笔记(1)

 
Java与Java EE平台规范标准化了各种具体Java技术,比如,JDBC,JMX,Servlet,Annotation和JNDI API等,这些具体技术正是Spring2.0统一一体中的具体侧面。Spring2.0是Java和Java EE架构级框架,其依托的正是这些具体Java技术。如果缺乏JCP制订的各项JSR规范,Spring2.0才可能到处运行。注意,“到处”一词可以表示与操作系统无关,Java EE应用用品无关,JVM无关等。
默认时,各种标准的具体的Java EE技术(服务)的使用并不轻松。客观的说,Java EE平台并未提供良好的编程模型。如今,开发基于Java EE的Spring同编写POJO并无实质性的差异。Spring框架提供的POJO编程模型赢得了开发者的广泛支持和拥戴,而这一POJO编程模型正是Spring2.0统一体中的抽象侧面。
同一个Web应用能够同时运行在不同厂商提供的Java EE应用服务器中。为完成集成各种Java EE API的夙愿,Spring尽量采用Java平台引入的标准技术实施这一集成工作,比如,采用动态代理,ThreadLocal,Java反射机制,各种设计模式。这说明,Spring框架从未对目标运行环境进行任何假定,因为它依赖的基础始终是Java平台中标准的Java技术。因此,开发者在使用Spring框架开发企业应用时,应用的便携性并未削弱,Java EE应用服务器提供的各种容器服务也能暴露给应用,而且Spring还针对各种Java EE技术,Java EE应用服务器的专有特性进行了集成和封装。
Spring IoC容器,AOP技术实现,各种Java EE API集成支持,这三者形成了鼎足之势,开发者可以在自身的应用中单独使用它们中的任何一者,但如果同时使用它们,POJO编程模型的威力将发挥到极致。我们也建议开发者直接采纳这三者,基于它们实施测试驱动开发(TDD)也非常容易。
前言
毫不夸张地说,Spring2.0是一套有关Java EE API的百科全书,它针对各种Java EE API的使用都提供了一流的,一致的抽象和集成工作,从而统一Java EE API暴露给开发者的客户视图。
为完成各种Java EE API的集成工作,Spring开发团队提供了Spring元框架,即控制返回容器(IoC)和AOP技术实现。所有的Java EE API集成工作都是在这一元框架基础之上构建的。从目前看,Spring2.0主要提供了3方面的Java EE API集成:DAO层集成技术;Java EE服务及技术;Web层支持。
同Spring1.x相比,Spring2.x改进的内容非常多。其一,引入基于XML Schema的配置,从而大大简化了Spring配置文件的管理,比如,事务管理,JNDI查找等;其二,同AspectJ 5进行了无缝集成,如果,Spring2.0开发者能够享受到@AspectJ风格的切面,pointcut表达语言,甚至,开发者可以针对领域对象实施依赖注入,并在Spring DI容器外享受到@Transactional注释带来的Spring受管事务;其三,的作用范围被扩充了,在Spring1.x中,仅存在单例和原型作用范围的。自Spring2.0开始,开发者能够享受到处于request,session,globalSession作用范围内的,从而提升Spring2.0在企业中的应用强度和深度;其四,Spring2.0全面拥抱Java SE 5/Java EE 5,各种Annotaion注释(比如@Required,@Configurable)被引入到Spring中,一流的JPA集成也被包括在Spring2.0中,JDBC集成引入了命名参数和泛型支持等;其五,异步JMS支持,Spring2.0引入了消息监听器容器,如今开发者可以享受到MDP编程模型,甚至,JMS远程服务也被Spring2.0囊括了;其六,动态脚本语言(比如,Groovy,JRuby和BeanShell)集成支持;其七,TaskExecutor抽象;其八,提升测试驱动开发(TDD)支持,比如Spring2.0于AbstractTransactionalSpringContextTests集成测试支持类中新引入了endTransaction()和startNewTransaction()方法,甚至,Spring2.0还针对JPA的集成测试引入了org.springframework.test.jpa包,而且它还引入了基于Annotation注释技术(Java SE 5+)的org.springframework.test.jp包,以简化集成测试工作的展开。上述所有内容,本书进行了全位跟进。
第1篇      Spring2.0 核心技术
话说“分久必合,合久必分”。在Java EE平台技术未出现前,各个服务器厂商以专有行为开发自身的服务器产品。在Java EE平台技术出现后,各个服务器产品遵循了Java EE相关技术规范。它们在遵循规范的同时,又引入了自身的专有行为,有些是由于Java EE规范未定义清晰导致的,有些是厂商的理解不到位造成的。Spring社区出现后,这些专有行为又被统一到一起,借助于DI容器能够耦合在一起,而且AOP技术的引入使得DI容器中受管POJO的威力更大。可以预见,Spring2.0将在Java EE 5时代成为主角,颠覆者,因为它提供的DI容器,AOP技术已经远远超越了Java EE容器提供的依赖性管理支持和@Interceptors拦截器支持。同Spring1.x相比,借助Spring2.0实施TDD更为敏捷。
Spring2.0核心技术将在本部分得到全方位的讨论。DI容器和AOP技术实现是整个Spring2.0框架的基础和Spring元框架(meta-framework)。Spring2.0提供伯DAO层集成技术(第二部分),Java EE服务及技术集成(第三部分)是建立在DI容器和AOP技术实现基础上的。类似于Eclipse平台技术,Spring框架具有自我繁殖能力,它是建立在元框架基础之上的框架。开发者可以通过Eclipse IDE开发Eclipse插件,从而扩充Eclipse IDE的功能。相比之下,Spring2.0也是如此。
本部分包括如下内容。
ü 第1章 Java EE 5:简要回顾Java EE 5中各种组件的开发,Annotation注释技术被广泛应用开来;随后,EJB3.0组件的开发也被介绍到。Java EE 5全面拥抱Annotation注释技术的同时,也暴露出Java EE编程模型的若干局限性,而这方面的内容也在本章给出了讨论。
ü 第2章 步入Spring2.0:从宏观上将Spring2.0告知给开发者。比如,它所倡导的POJO编程模型是如何超越Java EE编程模型的,Spring2.0的架构价值,Spring2.0涉足的具体技术领域等。
ü 第3章获得Spring2.0发布版和源码:为开发和调试Spring全能应用,开发者必须懂得如何去下载Spring2.0;另外,CVS和Subversion的使用被简单介绍到。整章内容都是围绕Spring2.0生态圈进行的。
ü 第4章启动Spring2.0使用项目:如今,持续集成是软件开发的必修课。为加速持续集成的实施,我们需要有敏捷的开发环境,而这两方面的内容都将在本章重点给出;我们还对Spring IDE的使用给出了详细介绍,缺乏Spring IDE的Spring2.0使能项目的开发过程会显得非常生涩。
ü 第5章控制反转容器:IoC容器如同EJB容器的地位。如果开发者对运行EJB3.0组件的EJB容器不了解,不熟悉,则怎么能够用好EJB组件技术呢?同样地,我们需要对掌控Spring受管POJO的IoC容器有充分的认知。
ü 第6章面向切面编程:AOP技术在企业应用中扮演着越来越重要的角色。尤其是,Spring2.0集成了著名的AspectJ 5,这是至今为止功能最完善,最强大的AOP技术实现。在集成AspectJ 5后,领域驱动开发(DDD)将会得到流行。如果开发者对AOP技术一无所知,没有关系,本章介绍的内容考虑到各种背景的开发者。本章花费了不少篇幅介绍AspectJ 5,并针对不同风格的Spring AOP使用给出了细致研究。比如,传统的Spring AOP用法,基于·AspectJ的AOP,基于AOP命名空间的AOP。毫不夸张地说,Spring2.0 AOP的威力无人能比。
第1章       Java EE 5
简化Java EE 5的开发和部署模型,是整个企业级Java领域一致的呼声,Java EE 5确实也达到了这一目标。在大范围采用Java SE 5引入的Annotation注释技术后,部署描述符几乎变得是多余的,如今,资源和组件的依赖性注入也可以交由Annotation注释去完成。无论是EJB3.0组件,还是Servlet,还是Web服务(JAX-WS),还是JSF受管Bean(后端Bean),Annotation注释技术的应用随处可见。
EJB3.0分布式组件技术是Java EE 5平台技术的核心,它是这次Java EE 5革新中的最大受益者,因为EJB3.0组件已经同POJO的差别越来越小了。同Spring2.0相比,EJB3.0,Java EE 5倡导的“POJO”编程模型还存在不少差距,我们将在最后的内容中一一道出这些差距。
1.1 Java EE 5 引入的新特性
Java EE 5的基调是简化开发(Ease of Development),期间,Annotation注解技术是主力军。Java SE 5引入的注解技术在Java EE 5中被广泛使用,比如@Resource。
实际上,@Resource同部署描述符中指定的元素的作用类似,但@Resource往前迈进了一大步。比如,注解直接可以作为Java代码的组成部分,在使用@Resource注解期间,只有其定义的各个成员的默认取值不符合开发要求时,开发者才需要显式使用它们。下面摘录了The Java EE 5 Tutorial中的SimpleMessageClient片断。注意,The Java EE 5 Tutorial是研究,学习Java EE平台技术的经典教程,建议Java EE初学者能够去Sun官方网站下载这一免费教程。
public class SimpleMessageClient{
         @Resource(mappedName="jms/ConnectionFactory")
         private static ConnectionFactory connectionFactory;
         @Resource(mappedName="jms/Queue")
         private static Queue queue;
 
         public static void main(String[] args){
                   //省略部分代码
                   try{
                            connection=connectionFactory.createConnection();
                            session=connection.createSession(false,Session.AUTO_ACKNOWLEDGE);
                            messageProducer=session.createProducer(queue);
                            //省略部分代码
                   }catch(JMSException e){
                            //省略部分代码
                   }finally{
                            if(connection!=null){
                                     connection.close();
                            }
                            //省略部分代码
                   }
 
                   //省略部分代码
         }
}
SimpleMessageClient将@Resource注解应用在属性一级(connectionFactory和queue),它们分别通过mappedName成员指定JMS连接工厂和JMS目的地的JNDI名。运行期间,Java EE容器会从JNDI树查找到这两个资源,并注入到connectionFactory和queue属性中。随后,开发者便能够在main()方法中使用这些属性,比如创建JMS Connection,消息生产者。
在使用完Connection对象后,开发者必须手工关闭这一JMS连接对象。另外,开发者必须手工关闭这一JMS连接对象。另外,开发者必须使用Java EE应用客户容器(比如GlassFish appclient)运行SimpleMessageClient示例应用,因为它使用到@Resource注解,否则appclient没有机会实施依赖注入。另外,由于mappedName成员是Java EE厂商专属行为,如果开发者换成name成员(JNDI名),并协同使用应用于类一级的@Resource注解,则SimpleMessageClient示例应用将变得更加便携。
上述过程展示了Java EE受管资源的依赖注入操作,这是Java EE 5新引入的特性。
在Java EE中定义和实现Web服务也非常简单,下面展示了The Java EE 5 Tutorial中的Hello Web服务实现。@WebService和@WebMethod注解使得目标类,方法具有Web服务能力,它们能够应用到POJO类(比如Hello),Servlet,EJB3.0组件中。
@WebService
public class Hello{
         private String message=new String("Hello, ");
 
         @WebMethod
         public String sayHello(String name){
                   return message+name+".";
         }
}
开发者借助JAX-WS2.0定义的@WebServiceRef注解能够访问到部署在Java EE容器,Web容器中的上述Web服务,JAX-WS2.0是Java EE 5的重要组成部分。下面展示了The Java EE 5 Tutorial中的示例代码。HelloClient也必须运行在Java EE应用客户容器中。
public class HelloClient{
         @WebServiceRef(wsdlLocation="http://localhost:8080/helloservice/hello?wsdl")
         static HelloService service;
 
         ......
}
如今,Servlet也能够享受到Annotation注解技术,下面摘录了The Java EE 5 Tutorial中的ReceiptServlet它借助@Resource注解将UserTransaction对象注入到utx属性。
public class ReceiptServlet extends HttpServlet{
         private BookDBAO bookDB;
         @Resource
         private UserTransaction utx;
 
         ......
}
借助@EJB注解,开发者还能够把EJB3.0组件注入到Servlet,JSF后端Bean,其他EJB3.0组件,运行于Java EE应用客户容器的POJO中。比如,The Java EE 5 Tutorial中的CustomerBean是一个JSF后端Bean,它将由Java EE容器管理,其示例代码如下。运行期间,Java EE容器会将EJB3.0组件注入到accountController和txController属性中。
public class CustomerBean{
         @EJB
         private AccountController accountController;
         private Long account;
         private Long customerId;
         @EJB
         private TxController txController;
 
         ......
}
总之,Java EE 5广泛使用各种Annotation注解技术后,开发者不用再借助JNDI API手工查找各种资源和协作者,而且整个Java EE开发模型得到了大大简化。
除了引入大量的Annotation注释外,Java EE 5还把基于组件开发模型的JSF1.2纳入旗下。另外,用于XML分析的新一代StAX API也被包括在Java EE 5平台技术。
1.2 进入EJB3.0 时代
从EJB组件的发展历史来看,EJB3.0的变化,革新是最大的,在EJB 1.x/2.x时代从未有过这种变化。由于受到POJO编程模型的猛烈冲击,Java EE 5推出的EJB3.0进行了大面积瘦身,实体Bean几乎已经成为了历史,取而代之的是新的JPA1.0规范。如今,EJB3.0组件同POJO的差距变得非常小了。Java EE 5深受Spring/Hibernate/Tapestry组合的影响。为了标准化开源领域的各种开发成果,Java EE 5希望JSF1.2和EJB3.0能够成为上述组合的劲敌。
EJB3.0是Java EE 5的最大受益者,自然地,开发者也将从中受益。下面摘录了The Java EE 5 Tutorial中的TxControllerBean EJB3.0组件。很显然,TxControllerBean在类一级同时应用了@DeclareRoles安全性注解和@Stateful有状态会话Bean注释。
@DeclareRoles("bankCustomer")
@Stateful
public class TxControllerBean implements TxController{
         private BigDecimal bigZero=new BigDecimal("0.00");
         @PersistenceContext
         private EntityManager em;
 
         @RolesAllowed("bankCustomer")
         public List getTxSOfAccount(){
                   ......
                   try{
                   }catch(Exception ex){
                  
                   }
                   return copyTxsToDetails(txs);
         }
         ......
}
在TxControllerBean 内部,还使用到JPA 的@PersistenceContext 注解,它会将实体管理器注入到em 属性中。另外,类外的@DeclareRoles 和@RolesAllowed 将启用Java EE 声明式安全性。而TxControllerBean 实现的TxController 远程接口应用了@Remote注解,如下。
@Remote
public interface TxController{
         ......
}
POJO只要使用@Stateless,@Stateful和@MessageDriven就被标识成了EJB3.0组件。如果需要,开发者还可以将井然有序会话Bean暴露成Web服务(Web Service)。下面摘录了The Java EE 5 Tutorial中的HelloServiceBean EJB3.0组件。
@Stateless
@WebService
public class HelloServiceBean{
         private String message="Hello, ";
         public void HelloServiceBean(){
         }
 
         @WebMethod
         public String sayHello(String name){
                   return message+name+".";
         }
}
如今,EJB3.0组件不用再去实现SessionBean,MessageDrivenBean等EJB2.x规范要求的父类,甚至EJB3.0生命周期回调(比如,@PrePassivate,@PostConstruct)也可以由开发者选择性提供。开发者还可以借助@AroundInvoke,@Interceptors实现类似AOP技术中的@Around装备。至于实体Bean,它已经被JPA Entity代替。下面摘录了The Java EE 5 Tutorial中的Order实体。
@Entity
@Table(name="EJB_ORDER_ORDER")
@NamedQuery(name="findAllOrders",query="SELECT o FROM Order o")
public class Order implements java.io.Serializable{
         private Collection lineItems;
         private Date lastUpdate;
         private Integer orderId;
         private String shipmentInfo;
         private char status;
         private int discount;
 
         ......
}
1.3 Java EE 开发模型的局限性
毫无疑问,当Annotation注解技术被Java EE 5广泛采纳后,整个Java EE开发模型确实被大大简化了,它朝POJO开发模型迈进了坚实的一步。如今,EJB组件,Web服务的开发如同编写POJO。但是,Java EE 5毕竟是初次大范围地使用Annotation技术,现有的Java EE开发模型也暴露了如下一些缺陷。
其一,在采纳Annotation注解技术后,比如@Resource,开发者不用再借助于JNDI API手工查找Java EE容器对象(如,JDBC DataSource,EJB3.0组件)。但如果开发者需要更细粒度的依赖注入(Dependency Injection, DI),则@Resource,@EJB等注解将无能为力。尽管一些Java EE容器提供了自身的扩展行为(比如WebLogic),但这并不是Java EE 5规范本身所具有的。目前,Java EE 5提供的依赖注入功能针对的都是容器管理的那些对象。
其二,Java EE 5提供的Annotation同时支持设计注入(setter)和属性注入(field)。常见的构建器注入并没有得到Annotation技术的支持。与此同时,Java EE 5并没有提供工厂Bean,工厂方法等高级依赖性管理特性。
其三,一旦在代码中使用Annotation后,如果需要调整注解的特定行为,比如将EJB3.0组件的事务管理策略(@TransactionManagement)从BMT(Bean管理事务)调整后,开发者还需要编译,打包好相应的EJB3.0组件,并重新发布到Java EE容器中。因此,Annotation并不是很灵活。尽管开发者可以同时采用部署描述符作为候选方案,但这好象回到了传统的EJB2.x。
其四,Java EE 5引入的大部分Annotation的解析工作必须在Java EE容器,Java EE应用客户容器(Application Client Contatiner,缩写ACC),Web容器中完成,这将给测试驱动开发(TDD)的实施带来困难。在完成代码,组件的单元测试期间,由于测试代码运行在容器之外,因此如何去模仿(Mock)它们的依赖性将会是一个难题。希望整个Java EE 5领域能够出现这方面的第三方框架解决这一棘手问题。
其五,Java EE引入的大部分Annotation的作用范围都是当前组件,比如单个EJB3.0组件,单个Servlet,单个JSF后端Bean,单个Web服务实现。一旦项目规模比较大时,许多组件的行为可能会很类似,这时会带来维护上的一系列问题。因此,Annotation注解缺乏灵活的,统一的配置入口,比如能够采用XML,属性文件等。
其六,javax.interceptor包引入了如下注释:@ExcludeClassInterceptoers,@AroundInvoke,@ExcludeDfaultInterceptors,@Interceptors,它们能够完成拦截器相关的配置工作。用于EJB3.0的拦截器必须显示地同EJB组件绑定在一起,比如Bean类中的某个方法应用了@AroundInvoke注释,或者在Bean类一级应用了@Interceptors。开发者必须在@Interceptors中指定目标拦截器类。EJB3.0引入的AOP缺乏pointcut支持,因此@Interceptors的使用略显笨拙。
其七,@Interceptors并不能够作用于POJO,或者说非Java EE容器受管的那类对象。在大部分情况下,只有在使用EJB3.0组件时,开发者才能够使用@Interceptors注解。
其八,Java SE 5,Java EE 5引入的Annotation并不支持继承。
其九,Annotation在完成某些Java EE容器受管资源的依赖注入后,必须手工关闭它们。此时,一堆的异常处理工作也抛给了开发者。应用开发者都希望Java EE容器能够智能地完成各种资源的获取,关闭操作。如果Annotation能够注入事务性连接,则这些连接的创建,关闭工作将交由Java EE容器完成,但到目前为止,只有处于EJB3.0组件中的JPAEntityManager(@PersistenceContext)能够做到。
1.4 小结
本章对Java EE 5引入的新特性(包括EJB3.0)进行了简要介绍,并在其基础上分析了Java EE开发模型的局限性,从而为下章内容埋下伏笔。Spring2.0是如何应对这些局限性的呢?“步入Spring2.0”一章会给开发者一个满意的答案。
请继续阅读吧!

 

 

您好:
    当您在阅读和使用我所提供的各种内容的时候,我非常感谢,您的阅读已是对我最大的支持。
    我更希望您能给予我更多的支持。
    1.希望您帮助我宣传我的博客,让更多的人知道它,从中获益。
    2.希望您能多提出宝贵意见,包括我所提供的内容中的错误,建设性的意见,更希望获得哪些方面的帮助,您的经验之谈等等。
    3.更希望能得到您经济上的支持。
   
    我博客上面的内容均属于个人的经验,所有的内容均为开源内容,允许您用于任何非商业用途,并不以付费为前提,如果您觉得在阅读和使用我所提供的各种内容的过程中,您得到了帮助,并能在经济上给予我支持,我将感激不尽。
   
    您可以通过银行转帐付款给我(5元10元的,随意):
    招商银行一卡通:
    卡号:6225888712586894
    姓名:牟勇
   
    您也可以通过汇款的方式(5元10元的,随意):
    通讯地址:云南省昆明市女子(28)中学人民中路如意巷1号
    收信人:陈谦转牟勇收
    邮编:650021
   
    无论您给予我怎么样的支持,我都衷心的再次感谢。
    欢迎光临我的博客,欢迎宣传我的博客
    http://hi.csdn.net/mouyong
    http://blog.csdn.net/mouyong
    http://blog.sina.com.cn/mouyong
    EMail:[email protected]

你可能感兴趣的:(默然说话)