下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
spring4中文技术手册==spring4中文技术手册在《静态代理和动态代理》中提到了面向方面编程,主要就是基于动态代理。单独抽象出非业务的功能,服务于某些业务方法。Spring提供了四种很实用的Advice,分别为:BeforeAdvice,AfterReturningAdvice,AroundAdvice,AfterthrowingAdvice。都是方法级别的,就是在某个方法执行前后插入一些非业务的操作,如打日志或者判断权限等。对于这四种advice的实现,spring都提供了三种方法,分别为基于接口、基于xml和基于annotation(注释)。BeforeAdvice会在目标对象的方法执行之前被调用;AfterAdvice会在目标方法执行之后被调用;AroundAdvice则可以在目标方法执行前后同时加上相关服务;ThrowAdvice是在异常发生后执行某些操作。1.基于接口的Advice这个就需要自定义的Aspect实现Spring接口。BeforeAdvice需要实现org.springframework.aop.MethodBeforeAdvice接口:/**
*
Advice
invoked
before
a
method
is
invoked.
Such
advices
cannot
*
prevent
the
method
call
proceeding,
unless
they
throw
a
Throwable.
*/
public
interface
MethodBeforeAdvice
extends
BeforeAdvice
{
/**
*
Callback
before
a
given
method
is
invoked.
*
@param
method
method
being
invoked
*
@param
args
arguments
to
the
method
*
@param
target
target
of
the
method
invocation.
May
be
<code>null</code>.
*
@throws
Throwable
if
this
object
wishes
to
abort
the
call.
*
Any
exception
thrown
will
be
returned
to
the
caller
if
it's
*
allowed
by
the
method
signature.
Otherwise
the
exception
*
will
be
wrapped
as
a
runtime
exception.
*/
void
before(Method
method,
Object[]
args,
Object
target)
throws
Throwable;
}
AfterAdvice实现org.springframework.aop.AfterReturningAdvice接口:spring4中文技术手册==全文共5页,当前为第1页。/**
spring4中文技术手册==全文共5页,当前为第1页。
*
After
returning
advice
is
invoked
only
on
normal
method
return,
not
if
an
*
exception
is
thrown.
Such
advice
can
see
the
return
value,
but
cannot
change
it.
*/
public
interface
AfterReturningAdvice
extends
AfterAdvice
{
/**
*
Callback
after
a
given
method
successfully
returned.
*
@param
returnValue
the
value
returned
by
the
method,
if
any
*
@param
method
method
being
invoked
*
@param
args
arguments
to
the
method
*
@param
target
target
of
the
method
invocation.
May
be
<code>null</code>.
*
@throws
Throwable
if
this
object
wishes
to
abort
the
call.
*
Any
exception
thrown
will
be
returned
to
the
caller
if
it's
*
allowed
by
the
method
signature.
Otherwise
the
exception
*
will
be
wrapped
as
a
runtime
exception.
*/
void
afterReturning(Object
returnValue,
Method
method,
Object[]
args,
Object
target)
throws
Throwable;
}
AroundAdvice需要实现ercept.MethodInterceptor接口:/**
*
<p>The
user
should
implement
the
{@link
#invoke(MethodInvocation)}
*
method
to
modify
the
original
behavior.
E.g.
the
following
class
*
implements
a
tracing
interceptor
(traces
all
the
calls
on
the
*
intercepted
method(s)):
*
*
<pre
class=code>
*
class
TracingInterceptor
implements
MethodInterceptor
{
*
Object
invoke(MethodInvocation
i)
throws
Throwable
{
*
System.out.println("method
"+i.getMethod()+"
is
called
on
"+
*
i.getThis()+"
with
args
"+i.getArguments());
*
Object
ret=ceed();
*
System.out.println("method
"+i.getMethod()+"
returns
"+ret);
spring4中文技术手册==全文共5页,当前为第2页。
*
return
ret;
spring4中文技术手册==全文共5页,当前为第2页。
*
}
*
}
*
</pre>
*/
public
interface
MethodInterceptor
extends
Interceptor
{
/**
*
Implement
this
method
to
perform
extra
treatments
before
and
*
after
the
invocation.
Polite
implementations
would
certainly
*
like
to
invoke
{@link
Joinpoint#proceed()}.
*
*
@param
invocation
the
method
invocation
joinpoint
*
@return
the
result
of
the
call
to
{@link
*
Joinpoint#proceed()},
might
be
intercepted
by
the
*
interceptor.
*
*
@throws
Throwable
if
the
interceptors
or
the
*
target-object
throws
an
exception.
*/
Object
invoke(MethodInvocation
invocation)
throws
Throwable;
}
类前面的注释说明了该方法的使用,就是要在invoke()方法中调用MethodIceed(),将执行传给下一个Interceptor,最终执行目标方法。在proceed()方法前后加操作,到达Aroudadvice的作用。在Aspect定义好后,就需要在bean定义文件中进行配置,通过org.springframework.aop.framework.ProxyFactoryBean的配置,指出接口、目标类和Aspect。如下:<bean
id="helloProxy"
class="org.springframework.aop.framework.ProxyFactoryBean">
<!--
业务接口
-->
<property
name="proxyInterfaces"
value="spring.advice.IHello"/>
<!--
实现该接口的目标类
-->
<property
name="target"
ref="helloSpeaker"/>
<!--
要应用的解释器,即实现非业务操作的Aspect
-->
<property
name="interceptorNames">
<list>
<value>throwAdvice</value>
<!--
还可以继续加,如
spring4中文技术手册==全文共5页,当前为第3页。
<value>logBeforeAdvice</value>
-->
spring4中文技术手册==全文共5页,当前为第3页。
</list>
</property>
</bean>
补充下,其中的目标类、解释器(Aspect)都要在Bean定义文件中先进行定义,然后才可以引用的。我们使用时,代码如下:IHello
helloProxy=(IHello)context.getBean("helloProxy");
helloProxy.hello();
在Bean定义文件中配置的Aspect就会在合适的joinPoint应用到目标方法上。补:IHello接口中有hello()方法,HelloSpeaker类实现了IHello接口。以免糊涂,给个实例如下,功能是在hello()方法前后加入日志记录。public
class
AroundAdvice
implements
MethodInterceptor{
private
Logger
logger=
Logger.getLogger(this.getClass().getName());
@Override
public
Object
invoke(MethodInvocation
methodInvocation)
throws
Throwable
{
logger.log(Level.INFO,
"method
starts..."+methodInvocation.getMethod());
Object
result=methodIceed();
logger.log(Level.INFO,"method
ends..."+methodInvocation.getMethod());
return
result;
}
}
配置:<?xml
version="1.0"
encoding="UTF-8"?>
<beans
xmlns="://./schema/beans"
xmlns:xsi="://./2001/XMLSchema-instance"
xsi:schemaLocation="://./schema/beans
://./schema/beans/spring-beans-3.0.xsd">
spring4中文技术手册==全文共5页,当前为第4页。
<bean
id="helloSpeaker"
class="spring.advice.HelloSpeaker"/>
spring4中文技术手册==全文共5页,当前为第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 光遗传学领域的研究行业市场调研分析报告
- 平卧式婴儿车产业链招商引资的调研报告
- 商业经纪行业市场调研分析报告
- 分隔层饰盘产品供应链分析
- 药用磷酸盐项目运营指导方案
- 为公司提供外包行政管理行业相关项目经营管理报告
- 医用砷解毒剂产品供应链分析
- 健康技术虚拟护理行业相关项目经营管理报告
- 奶酪熟化奶酪加工服务行业相关项目经营管理报告
- 云监控和管理行业经营分析报告
- 废油收集设备操作规程
- 皮质醇增多症教案
- 艺术设计专业人才需求报告
- T-CSSS 002-2023 健康成年人身体活动能量消耗参考值
- 普通高中历史课程标准
- 2022-2023学年英语(上)华侨中学八年级期中考试卷含答案
- 专题04新高考英语读后续写典例分析04-Yoghurt
- 中段考动员暨班级挑战赛活动方案
- 北师大版小学数学三年级上册第一单元《混合运算》 单元作业设计
- 社会保险业务申报表(申报1表)
- SAP全面预算管理解决方案BPC
评论
0/150
提交评论