如果有这样一个需求,为一个已知的API添加一个新的功能

由于是已知的API,我们不能修改其类,只能通过外部包装。但是如果通过之前的AOP前置或后置通知,又不太合理,最简单的办法就是实现某个我们自定义的接口,这个接口包含了想要添加的方法。

但是JAVA不是一门动态的语言,无法再编译后动态添加新的功能,这个时候就可以使用 aop:declare-parents 来做了。

  如果是可以改写的类,直接实现自定义的接口就行了,下面看看AOP是如何做的!

  最开始使用的类和接口:

package com.spring.test.declareparents;

public interface Chinese {
public void Say();
}
public class LiLei implements Chinese{
public void Say() {
System.out.println("我是中国人!");
}
}

  想要添加的新功能和接口

package com.spring.test.declareparents;

public interface Add {
public void Todo();
}
public class DoSomething implements Add{
public void Todo() {
System.out.println("我爱中国!");
}
}

  通过配置AOP,实现两种功能的耦合

    <bean id="lilei" class="com.spring.test.declareparents.LiLei"/>
<bean id="doSomething" class="com.spring.test.declareparents.DoSomething"/> <aop:config proxy-target-class="true">
<aop:aspect>
<aop:declare-parents
types-matching="com.spring.test.declareparents.LiLei"
implement-interface="com.spring.test.declareparents.Add"
default-impl="com.spring.test.declareparents.DoSomething"/>
</aop:aspect>
</aop:config>
</beans>

  其中types-mathcing是之前原始的类,implement-interface是想要添加的功能的接口,default-impl是新功能的默认的实现。

  在使用时,直接通过getBean获得bean转换成相应的接口就可以使用了。

        Chinese lilei = (Chinese)ctx.getBean("lilei");
lilei.Say(); Add lilei2 = (Add)ctx.getBean("lilei");
lilei2.Todo();

最新文章

  1. 判断一个值是否为null或者undefined
  2. 开发错误11:Configuration with name ‘default’ not found
  3. MVC 项目中为什么会有两个web.config
  4. C语言---文件
  5. IT技术的进化道路
  6. Centos6.6 tar包安装JDK
  7. 剑指 offer set 3 旋转数组的最小数字
  8. validate方法配置项
  9. vim下处理文档中的\r\n\t字符
  10. Android 开发笔记___alertDialog
  11. node-glob的*匹配
  12. python多版本共存
  13. KITTI数据集的使用——雷达与相机的数据融合
  14. 学习笔记GAN002:DCGAN
  15. OpenGL(2)-窗口
  16. c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)
  17. 使用 AVA 做自动化测试
  18. 2017微软 MVP 数据实践技术活动日(北京站)
  19. python(十二):网络编程之ISO/OSI模型
  20. Django—Model

热门文章

  1. Codeforces - 617E 年轻人的第一道莫队
  2. [转] 使用Gson进行json数据转换list to json 和json to list
  3. 地牢逃脱----DFS搜索最优解
  4. postgresql 的一些操作
  5. 【数据结构】最小生成树之prim算法和kruskal算法
  6. How to Configure Tomcat/JBoss and Apache HTTPD for Load Balancing and Failover
  7. nyoj 791——Color the fence——————【贪心】
  8. D3(v5) in TypeScript 坐标轴之 饼状图生成
  9. 吴恩达《Machine Learning Yearning》总结(11-20章)
  10. java中面向对象的三大特性小结