AOP研究文档格式.docx
- 文档编号:7772299
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:26
- 大小:22.70KB
AOP研究文档格式.docx
《AOP研究文档格式.docx》由会员分享,可在线阅读,更多相关《AOP研究文档格式.docx(26页珍藏版)》请在冰点文库上搜索。
5.引入(Introduction)
用来给一个类型声明额外的方法或属性(也被称为连接类型声明)。
Spring允许引入一个新的接口以及对应的实现到任何被代理的对象。
例如:
你可以使用引入来使一个bean实现IsModified接口,以便简化缓存机制。
6.目标对象(TargetObject)
被一个或多个切面通知的对象,也被称为被通知对象。
而在SpringAOP中,目标对象是通过运行时代理实现的,所以这个对象永远是被代理(Proxied)对象。
7.AOP代理(AOPProxy)
AOP框架创建的对象,用来实现某个契约。
在AOP中,AOP代理可以是JDK的Proxy或者CGLib。
8.织入(Weaving
把切面连接到其它应用程序类型或对象上,并创建一个被通知的对象。
这些可以在编译时(如使用AspectJ编译器),类加载时或运行时完成。
Spring和其它的AOP都是在运行时织入。
二通知(Advice)的类型
主要包含以下五种通知:
1)BeforeAdvice
在连接点执行的通知。
2)AfterreturningAdvice
在连接点之后执行的通知,如果没有任何异常,那就返回。
3)AfterthrowingAdvice
执行连接点时抛出异常退出时执行的通知。
4)AfterAdvice
在连接点退出的时候执行的通知,不管任何时候,都会被执行。
5)AroundAdvice
包围一个连接点的通知,如方法调用,这是最强大的通知类型。
可以在连接点前后完成自定义的行为,也可以选择是否继续执行连接点或者直接返回值或抛出异常来终止执行。
下面有一个Sample:
Java代码
1.PersonServiceBean
bean
=
(PersonServiceBean)this.targetObject;
2.
Object
result
null;
3.
if(bean.getUser()
!
null){
4.
//before
Advise():
前置通知
5.
try
{
6.
methodProxy.invoke(proxy,
args);
7.
//after
advise():
后置通知
8.
}
catch
(Exception
e)
9.
e.printStackTrace();
10.
//exception
例外通知
11.
}finally{
12.
//finally
Advise:
最终通知
13.
}
14.
PersonServiceBeanbean=(PersonServiceBean)this.targetObject;
Objectresult=null;
if(bean.getUser()!
=null){
//beforeAdvise():
前置通知
try{
result=methodProxy.invoke(proxy,args);
//afteradvise():
后置通知
}catch(Exceptione){
e.printStackTrace();
//exceptionAdvise():
例外通知
}finally{
//finallyAdvise:
最终通知
}
}
三AOP的实现方式---Proxy
Spring默认使用J2SE动态代理来作为AOP的代理,故对于代理接口而言用Proxy就可以执行。
1.Beans.xml
2.JDKProxyFactory.java
1.public
class
JdkProxyFactory
implements
InvocationHandler{
private
targetObject;
/**
*
创建代理对象
*/
public
CreateProxyInstance(Object
targetObject){
this.targetObject
return
Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(),
this);
拦截方法
15.
invoke(Object
proxy,
Method
method,
Object[]
args)
16.
throws
Throwable
17.
PersonServiceBean
18.
19.
20.
method.invoke(proxy,
21.
22.
result;
23.
24.}
publicclassJdkProxyFactoryimplementsInvocationHandler{
privateObjecttargetObject;
/**
*创建代理对象
*/
publicObjectCreateProxyInstance(ObjecttargetObject){
this.targetObject=targetObject;
returnProxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),
this.targetObject.getClass().getInterfaces(),this);
}
*拦截方法
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
PersonServiceBeanbean=(PersonServiceBean)this.targetObject;
result=method.invoke(proxy,args);
returnresult;
}
3.PersonService.java
interface
PersonService
void
save(String
user);
update(String
4.}
publicinterfacePersonService{
publicvoidsave(Stringuser);
publicvoidupdate(Stringuser);
4.PersonServiceBean.java
PersonService{
String
user
@param
user
PersonServiceBean(String
user)
this.user
user;
PersonServiceBean()
{}
@return
the
getUser()
to
set
setUser(String
24.
25.
26.
27.
user){
28.
System.out.println("
PersonServiceBean.save()
is
running"
);
29.
30.
31.
32.
PersonServiceBean.update()
33.
34.}
publicclassPersonServiceBeanimplementsPersonService{
privateStringuser=null;
*@paramuser
*/
publicPersonServiceBean(Stringuser){
this.user=user;
publicPersonServiceBean(){}
*@returntheuser
publicStringgetUser(){
returnuser;
*@paramusertheusertoset
publicvoidsetUser(Stringuser){
publicvoidsave(Stringuser){
System.out.println("
PersonServiceBean.save()isrunning"
publicvoidupdate(Stringuser){
PersonServiceBean.update()isrunning"
5.AopTest.java
1.JdkProxyFactory
factory
new
JdkProxyFactory();
personService
(PersonService)factory.CreateProxyInstance(new
PersonServiceBean("
Jamson"
));
personService.save("
888"
JdkProxyFactoryfactory=newJdkProxyFactory();
PersonServicepersonService=(PersonService)factory.CreateProxyInstance(newPersonServiceBean("
personService.save("
四AOP的实现方式---CGLib
如果是一个业务对象没有实现接口,在这种情况下,我们实现的解决方案------使用CGLib来代理。
2.CGlibProxyFactory.java
CGlibProxyFactory
MethodInterceptor
targetObject
@return
CreateObjectInstance(Object
Enhancer
enhancer
Enhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
enhancer.create();
intercept(Object
args,
MethodProxy
methodProxy)
34.
35.
36.
37.}
publicclassCGlibProxyFactoryimplementsMethodInterceptor{
*@paramtargetObject
*@return
publicObjectCreateObjectInstance(ObjecttargetObject){
Enhancerenhancer=newEnhancer();
enhancer.setSuperclass(this.targetObject.getClass());
enhancer.setCallback(this);
returnenhancer.create();
publicObjectintercept(Objectproxy,Methodmethod,Object[]args,
MethodProxymethodProxy)throwsThrowable{
3.PersonServiceBean.java:
同JDK
4.AopTest.java
1.CGlibProxyFactory
CGlibProxyFactory();
personServiceBean
(PersonServiceBean)factory.CreateProxyInstance(new
personServiceBean.save("
CGlibProxyFactoryfactory=newCGlibProxyFactory();
PersonServiceBeanpersonServiceBean=(PersonServiceBean)factory.CreateProxyInstance(newPersonServiceBean("
personServiceBean.save("
五XML配置AOP
由于Spring框架的支持,我们在实际的开发中使用XML配置或注解来实现AOP。
XML配置开发AOP,分为三步:
1.Service层的开发:
PersonService.java/PersonServiceBean.java同注解方式。
2.切面的开发
InteceptorClass
doAccessCheck(){
before
advice"
doWriteLog(String
result){
after
+"
:
"
+result);
doMemoryClear(){
finally
doWriteErrorLog(Exception
e){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AOP 研究