`
lk557
  • 浏览: 142407 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用Spring Introducation 让Java类实现动态语言特性

 
阅读更多

当我们没有一个实现类源代码以致不能为实现类增加新的方法时,我们在java语言中往往是无法实现的,但动态语言比(如JS),对动态对象增加可操作的方法是很容易得,我们借助Spring的Introduction这个特殊的advise,同样可以实现动态语言的这个特性

原始的业务接口及实现

packageIntroduction;

publicinterfaceISome{
publicvoiddoSome();

}



packageIntroduction;

publicclassSomeimplementsISome{

publicvoiddoSome(){
System.out.println(
"原来的方法");
}


}

我们新增的业务接口和实现,其中实现类同时实现了业务接口和Spring Introduction接口

packageIntroduction;

publicinterfaceIOther{
publicvoiddoOther();

}





packageIntroduction;


importorg.aopalliance.intercept.MethodInvocation;
importorg.springframework.aop.IntroductionInterceptor;

publicclassOtherimplementsIOther,IntroductionInterceptor{

publicvoiddoOther(){
System.out.println(
"增加的职责");
}


publicObjectinvoke(MethodInvocationmethodInvocation)throwsThrowable{
if(implementsInterface(methodInvocation.getMethod().getDeclaringClass())){
returnmethodInvocation.getMethod().invoke(this,methodInvocation.getArguments());
}
else{
returnmethodInvocation.proceed();
}


}

//判断是否来自与IOther接口的方法调用
publicbooleanimplementsInterface(Classclazz){
returnclazz.isAssignableFrom(IOther.class);
}


}

配置文件:

<?xmlversion="1.0"encoding="UTF-8"?>
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation
="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd">


<beanid="some"class="Introduction.Some"/>
<beanid="other"class="Introduction.Other"/>

<beanid="otherAdvisor"class="org.springframework.aop.support.DefaultIntroductionAdvisor">
<constructor-argref="other"></constructor-arg>
<constructor-argvalue="Introduction.IOther"></constructor-arg>
</bean>

<beanid="proxyFactoryBean"class="org.springframework.aop.framework.ProxyFactoryBean">

<propertyname="proxyInterfaces"value="Introduction.ISome"></property>
<propertyname="target"ref="some"></property>
<propertyname="interceptorNames">
<list>
<value>otherAdvisor</value>
</list>
</property>
</bean>

</beans>

测试代码:

packageIntroduction;

importorg.springframework.context.ApplicationContext;
importorg.springframework.context.support.ClassPathXmlApplicationContext;

publicclassTestSpring{
publicstaticvoidmain(Stringargs[])throwsException{

ApplicationContextctx
=newClassPathXmlApplicationContext("Introduction/applicationContext.xml");

ISomesome
=(ISome)ctx.getBean("proxyFactoryBean");

some.doSome();
//执行原来的方法
System.out.println("------------------");
((IOther)some).doOther();
//执行新增的方法
}

}

测试结果:

原来的方法
------------------
增加的职责

分享到:
评论

相关推荐

    <<Introducation to Java Programming(10th)>>Chapter1-3Codes

    第一章通常会介绍Java语言的基础,包括Java的历史、特点以及开发环境的搭建。Java是一种面向对象的、跨平台的编程语言,它的主要特点有:一次编写,到处运行(Write Once, Run Anywhere)、强类型、垃圾回收机制等...

    Git 原理介绍Introducation

    Git 原理介绍Introducation

    SAP_FI-CO-FM_Introducation

    这意味着在SAP环境中,不同模块之间的数据可以无缝共享,例如物流管理(LO)、财务管理(FI)、人力资源(HR)等模块的数据可以在一个统一的平台上实现互联互通。这一特性确保了数据的一致性和准确性,同时也提高了业务...

    IBM Introducation to the Seven Keys To Success.

    同时,合理分配人力、物力和财力资源,确保每个阶段都有足够的支持,以实现项目的顺利进行。 3. **风险管理与问题解决**: 风险管理是IBM项目管理中的重要环节。团队需识别可能的风险,评估其影响,并制定预防和...

    QML学习文档

    QML学习文档,希望对大家有帮助

    Introduction to Linear Algebra,5ed by Gilbert Strang part 3

    MIT 线性代数公开课指导用书 本书一共分为5个压缩包,请分别下载一起解压

    ScalaTutorial

    Scala official Tutorial,give you a introducation of the programming language.

    GAP Kickoff.xmind

    ODOO实施方法论 用于项目启动阶段的项目信息收集XMIND模板 在与关键用户开会时,使用XMind...使用这个模板,从右上角的元 素“Introducation”(引言) 开始,在面试时顺时针移动。(左边的节点用于在 讨论期间做笔记)。

    wince的一些资料

    包含五个ppt文件,有助WinCE入门 Binfs/The Introducation of XIP Chain/WINCE 5.0 Kernel Boot Process/Wince Image format/Windows Embedded CE 6.0

    CommandLine Framework(opensource)

    Introducation:(version 2009.8.3) The commandLine framework can help you build console command line system easily. Framework Features: (1)support custom defined mapping between commands and ...

    MyUniversity:我在大学里长大,有着流泪的历史

    titleMyUniversityProject Name我的大学Introducation--- Study history of blood and tears on Junior roadAbout Me--- Name:Cheng Feitian.--- University: Southwest University--- : I hope you can pay ...

Global site tag (gtag.js) - Google Analytics