e代剑客——温柔一刀
生活就像海洋,只有意志坚强的人,才能到达彼岸
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
76 随笔 :: 7 文章 :: 215 评论 :: 0 Trackbacks
随笔分类
(78)
Agile(3)
(rss)
java相关(33)
(rss)
ROR(2)
(rss)
web相关(1)
(rss)
其他(11)
(rss)
开源框架(19)
(rss)
数据库相关(8)
(rss)
生活点滴(1)
(rss)
随笔档案
(76)
2010年10月 (1)
2007年12月 (3)
2007年7月 (1)
2007年4月 (1)
2007年2月 (4)
2006年12月 (2)
2006年11月 (1)
2006年10月 (9)
2006年9月 (3)
2006年8月 (27)
2006年7月 (14)
2006年6月 (1)
2006年4月 (9)
java源码
java examples
java学习源代码检索中心
java开源大全
spring源码学习
友情连接
e代剑客—JavaEye
(rss)
开发文档
hibernate中文文档
Java2 API 规范
javascript参考手册
MySQL中文参考手册
Spring参考手册
spring进阶-IT实验室
XPath 教程
搜索
最新评论
1. re: Java应用iText动态生成PDF文件
e21e12eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
--eq23r
2. re: Toad for oracle 教程[未登录]
多谢!!!
--啊啊
3. re: Toad for oracle 教程
谢了
--后来者
4. re: Toad for oracle 教程
好人多
--hzlxm
5. re: Toad for oracle 教程
谢谢!
--stophy
阅读排行榜
1. Toad for oracle 教程(11263)
2. spring 生成Excel和PDF文件(7305)
3. javascript获取客户端网卡MAC地址和IP地址和计算机名(7278)
4. 最简单的iBatis入门例子(6602)
5. JXL操作Excel(6467)
评论排行榜
1. Toad for oracle 教程(109)
2. spring、ibatis控制oracle分页的问题 (23)
3. 最简单的iBatis入门例子(16)
4. 德比软件(DerbySoft)诚聘java工程师(上海)(10)
5. spring 生成Excel和PDF文件(7)
Spring AOP中文教程
AOP正在成为软件开发的下一个圣杯。使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect。AOP可以防止代码混乱。
为了理解AOP如何做到这点,考虑一下记日志的工作。日志本身不太可能是你开发的主程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中,那该多好啊。AOP可以帮助你做到。
Spring framework是很有前途的AOP技术。作为一种非侵略性的,轻型的AOP framework,你无需使用预编译器或其他的元标签,便可以在Java程序中使用它。这意味着开发团队里只需一人要对付AOP framework,其他人还是象往常一样编程。
AOP是很多直觉难以理解的术语的根源。幸运的是,你只要理解三个概念,就可以编写AOP模块。这三个概念是:advice,pointcut和advisor。advice是你想向别的程序内部不同的地方注入的代码。pointcut定义了需要注入advice的位置,通常是某个特定的类的一个public方法。advisor是pointcut和advice的装配器,是将advice注入主程序中预定义位置的代码。
既然我们知道了需要使用advisor向主要代码中注入“不可见的”advice,让我们实现一个Spring AOP的例子。在这个例子中,我们将实现一个before advice,这意味着advice的代码在被调用的public方法开始前被执行。以下是这个before advice的实现代码:
package
com.company.springaop.test;
import
java.lang.reflect.Method;
import
org.springframework.aop.MethodBeforeAdvice;
public
class
TestBeforeAdvice
implements
MethodBeforeAdvice
{
public
void
before(Method m, Object[] args, Object target)
throws
Throwable
{
System.out.println(
"
Hello world! (by
"
+
this
.getClass().getName()
+
"
)
"
);
}
}
接口MethodBeforeAdvice只有一个方法before需要实现,它定义了advice的实现。before方法共用三个参数,它们提供了相当丰富的信息。参数Method m是advice开始后执行的方法。方法名称可以用作判断是否执行代码的条件。Object[] args是传给被调用的public方法的参数数组。当需要记日志时,参数args和被执行方法的名称,都是非常有用的信息。你也可以改变传给m的参数,但要小心使用这个功能;编写最初主程序的程序员并不知道主程序可能会和传入参数的发生冲突。Object target是执行方法m对象的引用。
在下面的BeanImpl类中,每个public方法调用前,都会执行advice:
package
com.company.springaop.test;
public
class
BeanImpl
implements
Bean
{
public
void
theMethod()
{
System.out.println(
this
.getClass().getName()
+
"
.
"
+
new
Exception().getStackTrace()[
0
].getMethodName()
+
"
()
"
+
"
says HELLO!
"
);
}
}
类BeanImpl实现了下面的接口Bean:
package
com.company.springaop.test;
public
interface
Bean
{
public
void
theMethod();
}
虽然不是必须使用接口,但面向接口而不是面向实现编程是良好的编程实践,Spring也鼓励这样做。
pointcut和advice通过配置文件来实现,因此,接下来你只需编写主方法的Java代码:
package
com.company.springaop.test;
import
org.springframework.context.ApplicationContext;
import
org.springframework.context.support.FileSystemXmlApplicationContext;
public
class
Main
{
public
static
void
main(String[] args)
{
//
Read the configuration file
ApplicationContext ctx
=
new
FileSystemXmlApplicationContext(
"
springconfig.xml
"
);
//
Instantiate an object
Bean x
=
(Bean) ctx.getBean(
"
bean
"
);
//
Execute the public method of the bean (the test)
x.theMethod();
}
}
我们从读入和处理配置文件开始,接下来马上要创建它。这个配置文件将作为粘合程序不同部分的“胶水”。读入和处理配置文件后,我们会得到一个创建工厂ctx。任何一个Spring管理的对象都必须通过这个工厂来创建。对象通过工厂创建后便可正常使用。
仅仅用配置文件便可把程序的每一部分组装起来。
<?
xml version="1.0" encoding="UTF-8"
?>
<!
DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"
>
<
beans
>
<!--
CONFIG
-->
<
bean
id
="bean"
class
="org.springframework.aop.framework.ProxyFactoryBean"
>
<
property
name
="proxyInterfaces"
>
<
value
>
com.company.springaop.test.Bean
</
value
>
</
property
>
<
property
name
="target"
>
<
ref
local
="beanTarget"
/>
</
property
>
<
property
name
="interceptorNames"
>
<
list
>
<
value
>
theAdvisor
</
value
>
</
list
>
</
property
>
</
bean
>
<!--
CLASS
-->
<
bean
id
="beanTarget"
class
="com.company.springaop.test.BeanImpl"
/>
<!--
ADVISOR
-->
<!--
Note: An advisor assembles pointcut and advice
-->
<
bean
id
="theAdvisor"
class
="org.springframework.aop.support.RegexpMethodPointcutAdvisor"
>
<
property
name
="advice"
>
<
ref
local
="theBeforeAdvice"
/>
</
property
>
<
property
name
="pattern"
>
<
value
>
com\.company\.springaop\.test\.Bean\.theMethod
</
value
>
</
property
>
</
bean
>
<!--
ADVICE
-->
<
bean
id
="theBeforeAdvice"
class
="com.company.springaop.test.TestBeforeAdvice"
/>
</
beans
>
四个bean定义的次序并不重要。我们现在有了一个advice,一个包含了正则表达式pointcut的advisor,一个主程序类和一个配置好的接口,通过工厂ctx,这个接口返回自己本身实现的一个引用。
BeanImpl和TestBeforeAdvice都是直接配置。我们用一个唯一的ID创建一个bean元素,并指定了一个实现类。这就是全部的工作。
advisor通过Spring framework提供的一个RegexMethodPointcutAdvisor类来实现。我们用advisor的一个属性来指定它所需的advice-bean。第二个属性则用正则表达式定义了pointcut,确保良好的性能和易读性。
最后配置的是bean,它可以通过一个工厂来创建。bean的定义看起来比实际上要复杂。bean是ProxyFactoryBean的一个实现,它是Spring framework的一部分。这个bean的行为通过一下的三个属性来定义:
属性proxyInterface定义了接口类。
属性target指向本地配置的一个bean,这个bean返回一个接口的实现。
属性interceptorNames是唯一允许定义一个值列表的属性。这个列表包含所有需要在beanTarget上执行的advisor。注意,advisor列表的次序是非常重要的。
Spring工具
虽然你可以手工修改Ant构建脚本,但使用SpringUI(译注:SpringUI现在是Spring framework的一部分,并改名为spring-ide),使用Spring AOP变得很简单,只要点点鼠标即可。你可以把SpringUI安装成Eclipse的一个plug-in。然后,你只需在你的project上右击鼠标,并选择“add Spring Project Nature”。在project属性中,你可以在“Spring Project”下添加Spring配置文件。在编译前把下面的类库加入project:aopalliance.jar,commons-logging.jar,jakarta-oro-2.0.7.jar和spring.jar。运行程序时你会看到下面的信息:
... (logging information)
Hello world! (by com.company.springaop.test.TestBeforeAdvice)
com.company.springaop.test.BeanImpl.theMethod() says HELLO!
优点和缺点
Spring比起其他的framework更有优势,因为除了AOP以外,它提供了更多别的功能。作为一个轻型framework,它在J2EE不同的部分都可以发挥作用。因此,即使不想使用Spring AOP,你可能还是想使用Spring。另一个优点是,Spring并不要求开发团队所有的人员都会用它。学习Spring应该从Spring reference的第一页开始。读了本文后,你应该可以更好地理解Spring reference了。Spring唯一的缺点是缺乏更多的文档,但它的mailing list是个很好的补充,而且会不断地出现更多的文档。
posted on 2006-07-13 23:01
温柔一刀
阅读(279)
评论(0)
编辑
收藏
所属分类:
开源框架
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
使用OpenSessionInView模式时的一个异常问题解决方法
sping 、jxl 生成excel文件下载
spring 生成Excel和PDF文件
关于Acegi安全框架登陆后转向的疑问
使用Acegi 1.0获取用户信息
Spring+Hibernate中OpenSessionInView模式运用
spring、ibatis控制oracle分页的问题
ibatis 自带分页方法
Spring-Validator 说明文档
spring对commons_fileupload和cos_fileuplaod的封装
Powered by:
BlogJava
Copyright © 温柔一刀
联系偶
zhupanjava@gmail.com
温柔一刀