【Spring实战】—— 11 通过AOP为特定的类引入新的功能
时间:2022-04-22
本文章向大家介绍【Spring实战】—— 11 通过AOP为特定的类引入新的功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
如果有这样一个需求,为一个已知的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();
- java与ruby的直观比较
- 每天一个Linux命令:chmod
- SparkSql 中外连接查询中的谓词下推规则
- Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>
- Python进行数据可视化分析快速教程实例
- 一个抓取豆瓣图书的开源爬虫的详细步骤
- Java 8 Stream 教程 (三)
- silverlight ListBox 多列图片效果
- ZooKeeper构建分布式锁(选译)
- Caliburn.Micro学习笔记(二)----Actions
- 每天一个Linux命令:find
- textFile构建RDD的分区及compute计算策略
- 一个基于Flask和MongoDB的CMS内容管理系统
- c++多重继承小结
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SSM 单体框架 - 前端开发:课程和广告模块
- 80 行 Python 代码写个图形计算器
- 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等)
- SSM 单体框架 - 前端开发:用户和权限模块
- Cnitch:一款Docker引擎运行进程权限检测工具
- SAP Spartacus BrowserPlatformLocation的初始化逻辑
- 重启 CentOS 7 系统后的 IP 地址问题
- SSM 单体框架 - 前端开发:用户权限控制,Nginx 和项目部署与发布
- 用 Python 制作飞机大战小游戏
- SSM 单体框架 - 前端开发:视频讲解
- MyBatis 的 `<if test="">` 语句里面使用反单引号的问题
- 30 个Python代码实现的常用功能,精心整理版
- Java 后台开发面试题分享一
- IDEA 报错:no tests were found 和 UnsupportedOperationException
- Angular sandbox项目的tsconfig.json内容一览