- 浏览: 227197 次
- 性别:
- 来自: 深圳
-
文章分类
- 全部博客 (212)
- 架构师-01-文档目录 (3)
- 架构师-02-组织 (7)
- 架构师-03-实施 (35)
- 架构师-04-监督 (14)
- 架构师-05-工具 (29)
- 架构师-09-引用文集 (63)
- 专题-01-微博应用 (5)
- 专题-02-GoogleEarth (1)
- 专题-03-运行维护 (9)
- 专题-04-经纪人营平 (3)
- 专题-05-RCP&RAP (5)
- 专题-06-框架PK (3)
- 专题-07-Android (13)
- 专题-08-UI (3)
- 专题-liferay6 (6)
- 专题-extjs4 (3)
- 专题-CXF (3)
- 专题-封闭网络的社会化 (0)
- 扯谈 (4)
- 外包 (9)
- 专题-C++ (4)
- 专题-09-BI (2)
- jquery&easyui (2)
- 专题-搜索引擎 (1)
最新评论
-
brighter:
oMapper.configure(Deserializati ...
jackson 抛出 bean 中没有定义字段的错误,只好用 gson -
PassFeed_free:
public Bitmap decode(ImageDecod ...
android universalimageloader 几点改进 -
PassFeed_free:
楼主你好, 请问这个库, 在大屏显示高清图片 ,listvie ...
android universalimageloader 几点改进 -
yonghong:
楼主只是揣测
JIRA4.1 升级到 JIRA5.1 -
abdxj:
"Could NOT parse license t ...
JIRA4.1 升级到 JIRA5.1
引用说明:原文来自于http://developer.51cto.com/art/200702/40000.htm,为了方便本人阅读,文本格式略有调整。
在Java语言中,从织入切面的方式上来看,存在三种织入方式:编译期织入、类加载期织入和运行期织入。编译期织入是指在Java编译期,采用特殊的编译器,将切面织入到Java类中;而类加载期织入则指通过特殊的类加载器,在类字节码加载到JVM时,织入切面;运行期织入则是采用CGLib工具或JDK动态代理进行切面的织入。 AspectJ采用编译期织入和类加载期织入的方式织入切面,是语言级的AOP实现,提供了完备的AOP支持。它用AspectJ语言定义切面,在编译期或类加载期将切面织入到Java类中。 在低版本的Spring中,你只能通过接口定义切面,在Spring 2.0中你可以通过AspectJ的切点表达式语法定义切点,Spring 2.0采用AspectJ的解析包解析切点织入切面。但这并不是我们这篇文章要讲的内容。在这篇文章里,我们希望从更高的层面上集成Spring和AspectJ,直接采用AspectJ织入切面,并让Spring IoC容器管理切面实例。 Spring AOP提供了有限的AOP支持,在一般情况下,这些支持已经能够满足我们的开发要求,但如果对AOP有更高的要求(如实例化切面、属性访问切面等),则需要使用AspectJ的支持,而AspectJ又可以利用Spring IoC的依赖注入能力,两者相得益彰,琴瑟合鸣。 如何使用AspectJ LTW 我们前面提到过,AspectJ提供了两种切面织入方式,第一种通过特殊编译器,在编译期,将AspectJ语言编写的切面类织入到Java类中,可以通过一个Ant或Maven任务来完成这个操作;第二种方式是类加载期织入,也简称为LTW(Load Time Weaving)。这里,我们只介绍LTW的织入,编译期织入请参看:http://www.eclipse.org/aspectj/doc/released/devguide/antTasks.html。 使用AspectJ LTW有两个主要步骤,第一,通过JVM的-javaagent参数设置LTW的织入器类包,以代理JVM默认的类加载器;第二,LTW织入器需要一个aop.xml文件,在该文件中指定切面类和需要进行切面织入的目标类。下面,我们来了解一下具体的做法: 1.一般情况下,我们不会直接在DOS窗口中,通过Java命令启动应用或进行测试。这就要求我们在IDE环境下,或应用部署的环境下,设置JVM的参数。我们以Eclipse和Tomcat为例,分别讲述IDE和Web应用服务器中设置-javaapent JVM参数的方法。 在Eclipse下的设置 在Eclipse中,如果我们要改变JVM参数,可以在项目类导航树中选中某个可运行类->右键单击->Run As->Run...,可以在弹出的Run设置窗口设置该类的各项运行属性,切换到Arguments Tab页,在VM arguments中通过-javaagent指定AspectJ 织入器类包,如下图所示: 这里,我们设置为:-javaagent:D:\masterSpring\resources\aspectj-1.5.3\lib\aspectjweaver.jar 在Tomcat下的设置 打开<Tomcat_Home>\bin\catalina.bat,在该批处理文件头部添加以下的设置: set JAVA_OPTS=-javaagent:D:\masterSpring\resources\aspectj-1.5.3\lib\aspectjweaver.jar 这样,Tomcat服务启动时,JVM就会使用这个参数了。 2.配置LTW织入器的aop.xml织入配置文件 LTW织入器在工作时,首先会查找类路径下META-INF /aop.xml的配置文件,并根据配置文件的设置进行织入的操作。下面是一个简单的aop.xml文件: <aspectj>
<aspects>
<aspect name="com.baobaotao.aspectj.TestAspectJ"/> ①切面类
</aspects>
<weaver>
<include within="com.baobaotao..*"/> ② 指定需要进行织入操作的目标类范围
</weaver>
</aspectj> AspectJ织入切面结合Spring IoC容器管理切面实例 让AspectJ为Java类提供切面织入服务,同时让目标类和切面类享受Spring IoC依赖注入功能,这样,两者是紧密地集成在一起了。 首先,我们来看一下需要AspectJ进行切面织入的目标类: package com.baobaotao;
在①中,通过<aspect>指定LTW织入器需要处理的切面类,这些切面类是用AspectJ语法编写的。②处通过通配符指定需要进行织入操作的目标类。通过..*将需要处理的目标类限制在项目类包下是一个比较好的方法,否则织入器将对所有类进行操作,而这并不是我们期望的行为。
public class Waitress ...{
private String name;
public void serveTo(String client) ...{
System.out.println(name + " serves to " + client+"...");
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
}
-
-
Spring在aop命名空间中为配置AntationBeanConfigurerAspect提供了专门的配置元素:<aop:spring-configured/>,可以用这种简洁的配置替代①处的配置。在②和③处,我们在Spring IoC中配置了领域对象Bean。
至此,一切已经就绪,我们可以编写一个测试类测试Spring管理容器外对象的功能:
package com.baobaotao.configure;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class ConfigureAnnoAspectTest ...{
public static void main(String[] args) ...{
String configPath = "com/baobaotao/configure/beans.xml";
ApplicationContext ctx = new ClassPathXmlApplicationContext(configPath);
Thread thread = new Thread(); ① 象传统一样通过new构造领域对象
System.out.println(thread.toString()); ② 查看领域对象的信息
}
}
在①处使用传统创建领域对象的方式构造一个Thread领域对象,在②处打印出该领域对象的信息。为ConfigureAnnoAspectTest类设置好JVM的javaagent参数,启用AspectJ LTW织入器,设置完成后,运行该测试类,控制台将输出以下的信息: …① 以下两行表示织入器注册切面类
INFO [main] (AspectJWeaverMessageHandler.java:55)
- [AspectJ] register aspect
org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect
INFO [main] (AspectJWeaverMessageHandler.java:55)- [AspectJ] register aspect
org.springframework.transaction.aspectj.AnnotationTransactionAspect
…
②以下几行表示织入器对匹配目标类进行织入操作INFO [main] (AspectJWeaverMessageHandler.java:55)
- [AspectJ] weaving 'com/baobaotao/configure/Topic'
INFO [main] (AspectJWeaverMessageHandler.java:55) -[AspectJ] Join point 'initialization(void com.baobaotao.configure.Topic.<init>())'
in Type 'com.baobaotao.configure.Topic' (Topic.java:8) advised by
afterReturning advice from
'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect'
(AbstractBeanConfigurerAspect.aj:43)
INFO [main] (AspectJWeaverMessageHandler.java:55)- [AspectJ] weaving 'com/baobaotao/configure/Thread'
INFO [main] (AspectJWeaverMessageHandler.java:55) -[AspectJ] Join point 'initialization(void
com.baobaotao.configure.Thread.<init>())' in Type
'com.baobaotao.configure.Thread' (Thread.java:7) advised by
afterReturning advice from
'org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect'
(AbstractBeanConfigurerAspect.aj:43)'
③以下表示织入器略过不在目标范围内的类
INFO [main] (AspectJWeaverMessageHandler.java:55) - [AspectJ] not weaving
'org/springframework/context/support/ClassPathXmlApplicationContext'④领域对象的信息
title:测试的主题;
topic:title:测试帖子;content:测试内容
查看以上的信息,我们发现④处输出的领域信息是我们在Spring IoC容器中配置的信息,可见我们通过new Thread()创建的领域对象,其实已经从Spring IoC容器中获取到对应的Bean了。
这个过程参与的角色比较多,关系错踪复杂,我们有必须对这一过程重新进行梳理,找出角色间的关系和参与的操作,请看下图:
AspectJ LTW织入器(aspectjweaver.jar)根据aop.xml中配置信息,在类加载期将切面类(AnnotationBeanConfigurerAspect)织入到标注@Configurable的类(Thread和Topic)中。Spring IoC容器中配置了AnnotationBeanConfigurerAspect,使其可以感知Spring IoC容器,此外,Spring还为标注了@Configurable的类配置了对应的Bean。这样,Thread和Topic通过new实例化对象时,其实是通过AnnotationBeanConfigurerAspect从容器中获取实例。
在这一过程中,我们有两个问题需要进一步说明:第一,AnnotationBeanConfigurerAspect是静态的类,也即一个ClassLoader对应一个实例;第二,AnnotationBeanConfigurerAspect通过类反射机制获取Thread和Topic的类全限定名:com.baobaotao.configure.Thread和com.baobaotao.configure.Topic,并用这个名称到Spring IoC容器中获取对应的Bean,因为如果配置时未指定Bean的名字,Spring使用类的全限定类作为Bean的名字。如果你希望采用命名的Bean,则需要在@Configurable中指定Bean的命名,如@Configurable(“thread”)。
小结
Spring 2.0对AOP进行了很大的改善,除了提供基于@ApsectJ和Schema的切面定义外,还允许集成AspectJ,即使用AspectJ切面织入功能,又可以通过Spring IoC管理切面类和目标类。所以,只要你愿意,完全可以使用AspectJ进行切面定义,而使用Spring 2.0进行Bean的管理。究竟如何选择,最好从实际项目的需要出发,以最Progaramtic的方式选择其中最简单最适合的方式。
这样,标注了@Configurable的类通过AspectJ LTW织入器织入AnnotationBeanConfigurerAspect切面后,就和Spring IoC容器间接关联起来了,实现了Spring管理容器外对象的功能。
展现该功能的一个比较好的实例是管理Spring IoC容器外的领域对象。回想一下我们通常如何进行Dao类的单元测试:比如测试一个论坛主题ThreadDao。首先,我们需要在单元测试类中手工创建论坛主题Thread领域对象、帖子Topic领域对象、附件Attachment领域对象并设置好属性值,然后手工设置这些领域对象的关联关系。
对于习惯了使用Spring IoC依赖注入功能的开发者而言,可能更希望让Spring IoC容器来做这样工作——当然,原来我们就可以做这样的工作,在Spring配置文件中配置好领域对象,然后通过ctx.getBean(beanName)获取领域对象。但很多开发者可能并不喜欢这种方式。他们既希望以传统的new Thread()方式创建领域对象,但又能够享受Spring IoC所提供的依赖注入的好处。Spring管理容器外对象的功能让我们拥有了这个能力。
下面,我们将通过一个实例展现这一神秘的功能。首先,来看一下我们希望管理的两个领域对象:
package com.baobaotao.configure;
import java.io.Serializable;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable ①
public class Thread implements Serializable...{
private String title;
private Topic topic;
//get/setter
public String toString()...{
return "title:"+title+";\ntopic:"+topic;
}
}
Thread是论坛主题的领域对象,一个论坛主题对应一个主帖,并拥有多个跟帖,为了简单,这里仅保留主贴对象topic,Topic领域对象类如下所示:package com.baobaotao.configure;
import java.io.Serializable;
import org.springframework.beans.factory.annotation.Configurable;
@Configurable ①
public class Topic implements Serializable...{
private String title;
private String content;
//get/setter
public String toString()...{
return "title:"+title+";content:"+content;
}
}
Thread和Topic在①处,都标注了@Configurable注解。仅仅标注了注解并没有任何用途,我们需要利用AspectJ LTW在加载这些领域对象类时为标注@Configurable注解的类织入切面。
首先,我们得将匹配@Configurable注解类的切面类AnnotationBeanConfigurerAspect所在的spring-aspects.jar类包添加到类路径上。spring-aspects.jar类包本身拥有一个aop.xml配置文件,其内容如下所示:<aspectj>
<aspects>
<aspect name="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"/>
<aspect name="org.springframework.transaction.aspectj.AnnotationTransactionAspect"/>
</aspects>
</aspectj>该配置文件会将AnnotationBeanConfigurerAspect和AnnotationTransactionAspect切面类应用到所有类中。
AnnotationTransactionAspect用于处理@Transaction注解,这里我们没有用到。由于,我们希望限制进行AspectJ切面织入目标类的范围,所以我们需要再定义一个aop.xml文件:
<?xml version="1.0"?>
<aspectj>
<weaver options="-showWeaveInfo-XmessageHandlerClass:org.springframework.aop.aspectj.AspectJWeaverMessageHandler">
<include within="com.baobaotao.configure..*" /> ① 使AspectJ织入器仅对该包下类进行操作
</weaver>
</aspectj>
通过<weaver>的options属性的设置,指定在日志中显示织入操作的信息,通过<include>元素指定需要进行AspectJ织入的目标类。可以简单地将这个配置文件放到src/META-INF/目录下。
前面,我们提到过切面类AnnotationBeanConfigurerAspect实现了BeanFactoryAware接口,所以需要在Spring配置文件中配置它,以便其可以感知Spring IoC容器,此外我们还需要配置Thread和Topic领域对象Bean,为标注了@Configurable的领域对象提供依赖注入的功能:<bean class="org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect"
factory-method="aspectOf"/>①
<bean class="com.baobaotao.configure.Topic" scope="prototype"> ② 配置领域对象
<property name="title" value="测试帖子"/>
<property name="content" value="测试内容"/>
</bean>
<bean class="com.baobaotao.configure.Thread" scope="prototype"> ③ 配置领域对象
<property name="title" value="测试的主题"/>
<property name="topic" ref="com.baobaotao.configure.Topic"/>
</bean>
在①处我们声明了一个AnnotationBeanConfigurerAspect Bean,并且定义了factory-method="aspectOf"属性,确保Spring从AspectJ获取切面实例,而不是尝试自己去创建该实例。 -
Waitress拥有一个name属性和一个serveTo()方法。现在我们需要通过AspectJ为Waitress进行切面织入,以便在侍者提供服务之前强制使用礼貌用语:
|
(注:为了能够编写AspectJ的切面,你首先需要从http://www.eclipse.org/aspectj/downloads.php下载AspectJ开发插件,以支持AspectJ语法。目前AspectJ分别为Eclipse、JBuilder、NetBeans、JDeveloper IDE.以及Emacs and JDEE提供了插件。)
TestAspectj切面类将对Waitress的serveTo()方法进行前置增强,在①处定义了切点,在②处定义了前置增强方法。此外,该切面类还拥有一个message属性,用于提供规范的服务前礼貌用语,我们希望通过配置,在Spring IoC容器中注入该属性。
在Spring配置文件中,我们可以按配置一般Bean相似的方式配置AspectJ切面类(TestApectj)和织入AspectJ的目标类(Waitress):
|
注意,配置AspectJ切面类里,需要指定factory-method="aspectOf"属性,以便确保Spring从AspectJ获取切面实例,而非自己创建该实例。
为了让ThreadAspectj起作用,当然我们需要调整aop.xml的配置:
|
运行以下的测试代码(同样的,你需要为该类设置JVM javaagent参数):
|
控制台输出以下的信息:
①说明AspectJ切面织入到Waitress..serveTo()中,且礼貌用语从Spring IoC中注入
From AspectJ:How are you!
Katty serves to Johnson...
从输出信息中,我们可以知道,Spring成功地管理了AspectJ的切面,AspectJ的切面类也成功地织入到目标类中。
让Spring管理容器外的对象
Spring为管理容器外创建的对象提供了一个AspectJ语法编写的切面类:
org.springframework.beans.factory.aspectj.AnnotationBeanConfigurerAspect,它位于spring-aspects.jar包中。spring-aspects.jar类包没有随Spring标准版一起发布,但你可以在完整版中找到它,位于Spring项目的dist目录下。该切面类匹配所有标注@Configurable的类,该注解类org.springframework.beans.factory.annotation.Configurable则位于spring.jar中。
AspectJ在类加载时,将AnnotationBeanConfigurerAspect切面将织入到标注有@Configurable注解的类中。
AnnotationBeanConfigurerAspect将这些类和Spring IoC容器进行了关联,AnnotationBeanConfigurerAspect本身实现了BeanFactoryAware的接口。
发表评论
-
深入理解Java:SimpleDateFormat安全的时间格式化
2014-06-26 01:45 461原文引用自:http://www.cnblogs.com/p ... -
注册MS CRM 2011 online
2014-04-24 00:38 505http://www.cnblogs.com/StoneGa ... -
微信架构推测
2013-08-06 09:45 1337原文:http://wenku.baidu.com/vie ... -
arc-04-10-手机应用的性能测试
2013-01-05 15:01 679手机性能测试的工具一大堆,但专门针对开发手机应用的性能测试工 ... -
GraphicsMagick 介绍及安装
2012-12-26 16:56 1239引用说明:原文来自 http://paris8.org/a/b ... -
在windows系统中生成数字证书-V3
2012-12-10 16:43 1056引用说明:原文来自 http://zhouyongqiang. ... -
如何从最大用户并发数推算出系统最大用户数
2012-11-19 14:52 1415引用说明:原来来自 ht ... -
使用JIRA搭建企业问题跟踪系统
2012-07-20 09:33 0原文来自:http://www.blogjava.net/zh ... -
Eclipse rcp/rap 开发经验总结
2012-01-11 23:48 1261有牛人将 Eclipse RCP & RAP 开发经验 ... -
VMware Server 在 CentOS 下的安装与配置
2012-01-08 09:46 1097引用说明:原文来 ... -
rdesktop:Linux 下的远程桌面客户端
2012-01-07 11:37 943引用说明:原文来自于 http://blog. ... -
解决 Oracle 11g存在密码过期问题
2012-01-04 09:52 795引用说明:原文来自 ... -
角色权限,RBAC
2011-12-27 23:00 869引用说明:原文来 ... -
Spring Security 2 配置精讲
2011-12-12 20:10 775引用说明:原文来 ... -
Linux下Mongodb的分布式分片群集(sharding cluster)配置
2011-12-12 09:45 823引用说明:原文来自于http://www.linux ... -
使用 JReble 实现 tomcat 热布署
2011-11-24 09:42 2093甚至有人为了实现热部署,放弃各种框架(struts, spri ... -
基于MongoDB的好友消息动态的实现思路
2011-10-18 13:45 1548引用说明:原文来自 ... -
Linkedin网站技术架构简介
2011-10-11 14:41 1211引用说明:原文来 ... -
微薄后台架构浅析
2011-10-11 14:00 779引用说明:原文来自于http://blog.sina.c ... -
通过 Flick 看数据库集群
2011-09-19 14:14 827原文参见 http://www.cchere.com/arti ...
相关推荐
用于在Spring 2.0中集成AspectJ AspectJ LTW织入器 ognl.jar OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以...
《Spring 2.0 技术手册》是继 Spring 1.0 之后的重要著作,作者林信良针对 Spring 框架在 2.0 版本中的新特性进行了深入剖析与讲解。本书不仅适合于已经有一定 Java 开发基础的学习者,也适用于想要深入了解 Spring ...
下面我们将逐一探讨这些jar包的功能和它们在Spring 2.0中的作用。 1. spring-beans.jar:这是Spring框架的核心模块之一,提供了Bean工厂,它是Spring管理对象(bean)的基础。Bean工厂负责创建、配置和管理应用中的...
《Spring2.0宝典丛书》是一套深入探讨Spring 2.0框架的权威指南,旨在帮助开发者全面理解和掌握这一核心Java企业级开发框架。该系列书籍覆盖了Spring框架的各个方面,从基础概念到高级特性,为读者提供了丰富的学习...
此外,Spring2.0的AOP支持还包含对AspectJ的集成,使得基于注解的切面编程成为可能,降低了配置复杂性。 另一个显著变化是IoC(控制反转)的改进。Spring2.0增强了依赖注入,支持了构造器注入和setter注入,以及...
7. **AspectJ集成**:Spring 2.0开始支持AspectJ,可以进行类型级别的AOP编程,提供更强大的切面定义能力。 8. **国际化(i18n)与本地化(l10n)**:Spring提供了方便的工具和支持,使应用程序能够根据用户区域...
2.0版本引入了许多新特性,比如对Java 5(包括注解支持)、XML命名空间的改进,以及集成了一些流行技术比如AspectJ等。该版本还加强了对Web服务的支持,增加了声明式事务管理功能,并提供了更多用于数据访问的抽象层...
标题中的“spring2.0学习笔记+spring定时任务”表明了这个压缩包文件包含的是关于Spring框架2.0版本的学习资料,特别是关于Spring的定时任务功能。Spring是Java开发中最广泛应用的轻量级框架之一,它提供了一整套...
Spring Security(原名Acegi Security)是Spring生态中的安全框架,提供了认证、授权、会话管理等功能,能够与Spring MVC和其他Spring模块无缝集成,实现企业级应用的安全防护。 综上,《Spring 2.0 中文用户指南》...
Spring AOP是内建在Spring框架中的,而AspectJ是独立的AOP框架。Spring 2.0版本已经增强了对AspectJ的支持,允许开发者利用更强大的表达式语言和编译时织入,提升性能。 8. **测试支持** Spring提供了强大的测试...
- **更好的测试支持**:Spring2.0提供了更强大的测试工具,方便开发者进行单元测试和集成测试。 #### 七、Spring配置文件详解 - **Bean定义**:使用`<bean>`标签定义一个Bean,可以指定其class属性以及初始化参数...
《罗时飞精通Spring2.0源码》是一份深入解析Spring框架核心源码的教程,旨在帮助读者深入了解Spring的工作原理及其设计模式。Spring作为Java领域最广泛应用的轻量级框架,它的强大功能和灵活性使其在企业级开发中...
Spring 2.0是Spring框架的一个重要里程碑,它在前一版本的基础上引入了许多新特性,进一步增强了该框架的灵活性和可扩展性。本参考手册详细阐述了这些改进,旨在帮助开发者更好地理解和应用Spring 2.0。以下是核心...
4. **Spring MVC增强**:Spring Web MVC在3.0版本中得到了显著增强,包括支持RESTful风格的URL映射、支持异步请求处理、模板引擎集成(如FreeMarker、Thymeleaf)以及改进的视图解析。 5. **数据访问增强**:Spring...
Spring 2.0版本在2006年发布,是Spring框架发展历史上的一个重要里程碑。它提供了一个全面的编程和配置模型,旨在简化Java应用程序的开发,特别是企业级应用。Spring 2.0带来了许多新特性,包括改进的AOP支持、增强...
在Spring 2.0中,DI可以通过XML配置、注解或基于Java的配置实现。例如,`@Autowired`注解可以自动将符合条件的bean注入到目标字段或方法中,极大地简化了代码。 其次,Spring的IoC(Inversion of Control,控制反转...
在深入探讨Spring2.0的知识点之前,首先理解几个核心概念至关重要。Spring框架的核心设计理念是控制反转(Inversion of Control, IoC)和依赖注入(Dependency Injection, DI)。IoC意味着应用程序的控制权从代码...
Spring 2.0是Spring框架的一个重要版本,引入了许多增强的功能,例如支持JSR-250注解、更强大的数据访问抽象以及对AspectJ的全面集成。这些改进使得Spring成为构建松耦合、模块化应用的理想选择。 XFire 1.2.6是...