Spring AOP中的Introduction:
正如前面已经提到的,Introduction和前面的四个advice是有很大的区别的,introduction用于给target引入新的接口(例如锁,状态等功能),生成一个mix-in的接口。而普通的advice只是在原有接口基础上增加附加内容。
在Spring中,完成一个introduction需要三个内容:1、将要添加的新接口的定义,2、该新接口的实现,在实现的class中,必须实现Spring的IntroductionInterceptor接口(Spring in action原文有误),3、IntroductionAdvisor接口的实现。
public interface IntroductionInterceptor extends MethodInterceptor {
boolean implementsInterface(Class intf);
Object invoke(MethodInvocation invocation) //此方法来源于MethodInterceptor
}
其中implementsInterface方法返回一个boolean值,此方法用于判断该introduction实现是否实现了某个接口――intf参数。所有对intf接口的调用都会转发给invoke方法,由invoke方法完成相应的任务。下面给出例子(给某个类添加是否auditable功能):
public interface Auditable {//1、auditable接口的定义
void setLastModifiedDate(Date date);
Date getLastModifiedDate();
}
public class AuditableMixin
implements IntroductionInterceptor, Auditable {//2、auditable接口的实现,同时要实现IntroductionInterceptor接口
public boolean implementsInterface(Class intf) {
return intf.isAssignableFrom(Auditable.class); // AuditableMixin实现了Auditable类的功能
}
public Object invoke(MethodInvocation m) throws Throwable {
if (implementsInterface(m.getMethod().getDeclaringClass())) {//对invoke的参数m进行判断,当前的调用是否在implementsInterface范围内,即,当前的调用是否是auditable接口中的方法?
return m.getMethod().invoke(this, m.getArguments());
//这里的this就是自己,调用引入的方法(属于auditable接口的方法),这样也就给target添加了新的auditable接口。
} else {
return m.proceed();//其他方法的调用。
}
}
private Date lastModifiedDate; //实现auditable接口。
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate
}
}
在Spring中,除了上面直接实现IntroductionInterceptor接口之外,还可以通过继承DelegatingIntroductionInterceptor类实现。其中DelegatingIntroductionInterceptor给出了IntroductionInterceptor接口中的两个方法(implementsInterface,invoke)的默认实现,你仅需要实现auditable接口即可。
通过跟踪Spring源代码可以发现:DelegatingIntroductionInterceptor的implementsInterface (在IntroductionInfoSupport类中)和invoke方法与上面的代码的形式基本一致。下面是利用DelegatingIntroductionInterceptor写出的AuditableMixin:
public class AuditableMixin extends DelegatingIntroductionInterceptor implements Auditable {
private Date lastModifiedDate;
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
}
注意到一点:上面的两个AuditableMixin的实现都仅仅是给Target添加行为,但是未曾改变Target的原有行为(因为在invoke方法的实现中,还是会转发给Target)。如果需要改变Target的行为(例如给Target增加lock接口,一旦处于locked状态,那么再调用Target的方法就会出现异常),这就需要自己写代码修改invoke方法。
public class ImmutableMixin extends DelegatingIntroductionInterceptor implements Immutable {
private boolean immutable;
public void setImmutable(boolean immutable) {
this.immutable = immutable;
}
public Object invoke(MethodInvocation mi) throws Throwable {
String name = mi.getMethod().getName();
if (immutable && name.indexOf("set") == 0) { //这里一旦已经是immutable了,那么就不可以调用setXXX方法了,这也就改变了Target的行为,而不是前面的仅增加接口。
throw new IllegalModificationException();
}
return super.invoke(mi);
}
}
Spring中的Introduction需要有自己的advisor: IntroductionAdvisor
剩下的也就是和前面一样的xml文件的编写了。
Spring中使用Introduction需要注意的问题:
由于Spring使用的是动态AOP,并没有象AspectJ使用静态的代码预编译的方式生成AOP代码,因此只有你从Spring的 BeanFactory中得到的Introduction Bean才会已经被introducted,而直接在代码中new出来的target对象则不具有Intorduction功能。你可以使用一个Factory,封装对Introduction的创建。
分享到:
相关推荐
**Spring Advice插件平台开发项目源代码详解** 在软件开发领域,Spring框架因其强大的功能和灵活性,成为Java企业级应用的首选。Spring Advice是Spring AOP(面向切面编程)的一部分,它允许开发者定义和实现特定的...
**Spring AOP - Advice 概述** 在Spring框架中,AOP(Aspect Oriented Programming,面向切面编程)是一种强大的工具,它允许开发者定义“横切关注点”,这些关注点是跨越多个对象和方法的通用行为,如日志、事务...
1. NASA科学技术咨询:文档标题“NASA-275710-science_advice_book_tagged”和描述“NASA science advice book,技术要求及建议参考书。来自官网”表明,本文档是关于美国国家航空航天局(NASA)的科学技术咨询。...
本篇主要探讨如何在AOP的Advice方法中获取目标方法的参数。 首先,理解AOP的基本概念至关重要。在Spring AOP中,切面(Aspect)是关注点的模块化,它包含切点(Pointcut)和通知(Advice)。切点定义了应用中哪些...
构建深度神经网络是一项复杂且充满挑战的任务,涉及到感知、控制和认知等多个领域。在这篇文章中,我们将根据在机器学习实验室中积累的经验,分享一些关于构建深度神经网络的实用建议,特别是以感知、控制、认知为...
开发Spring的过程中出现Eclipse不能识别<tx:advice />标签,需要引用 spring-tx标签,spring-tx-4.0.xsd 可以解决标签不识别的问题
《深入理解Spring AOP:基于org.aopalliance.aop.Advice.jar的分析》 在Java世界中,Spring框架以其强大的功能和灵活的设计理念深受广大开发者喜爱。在Spring框架中,AOP(面向切面编程)是其核心特性之一,它提供...
### 软件工程建议:构建大规模分布式系统 在当今高度数字化的世界中,构建和维护大规模分布式系统成为了软件工程师的一项核心挑战。本文基于杰夫·迪恩(Jeff Dean)的经验分享,深入探讨了构建此类系统时所面临的...
### 关于ETAS Safety Advice的关键知识点 #### 一、引言 ETAS是一家专注于汽车电子领域的全球性企业,提供从工具链到系统解决方案的一站式服务。本文档《ETAS_Safety_Advice.pdf》旨在为用户提供重要的安全指导,...
a good book for students
【八年级英语上Unit 5 Advice Needed学案详解】 在八年级英语上Unit 5 Advice Needed的学习中,学生们将深入探讨如何提供和接受建议。这一单元聚焦于词汇、句型和语法,旨在培养学生的沟通能力和问题解决技巧。下面...
advice from grandad 公开课PPT学习教案.pptx
Real World SQL and PLSQL Advice from the Experts 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 查看此书详细信息请在美国亚马逊官网搜索此书
"Advice for applying machine learning"这一主题涵盖了在实际项目中实施机器学习模型时需要考虑的关键点。在这个编程作业中,我们可能涉及了如何利用Jupyter Notebook进行实验和分析,以及如何在机器学习与数据挖掘...
"Advice-app"是一个基于JavaScript开发的应用程序,旨在提供随机但实用的生活建议。在这个项目中,JavaScript作为主要的编程语言,负责处理用户交互、数据生成以及界面更新等关键功能。下面我们将详细探讨JavaScript...
在当今的数据驱动时代,企业收集了大量数据,但往往未能有效利用这些数据。众多决策者面临的挑战包括数据不一致性、重复、时间敏感性、来自不同数据源的数据,以及数据过载。为了应对这些挑战,数据挖掘成为了组织...