【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();
【Spring实战】—— 11 通过AOP为特定的类引入新的功能的更多相关文章
- 【Spring实战】—— 10 AOP针对参数的通知
通过前面的学习,可以了解到 Spring的AOP可以很方便的监控到方法级别的执行 ,针对于某个方法实现通知响应. 那么对于方法的参数如何呢? 比如我们有一个方法,每次传入了一个字符串,我想要知道每次传 ...
- 【Spring实战】—— 9 AOP环绕通知
假如有这么一个场景,需要统计某个方法执行的时间,如何做呢? 典型的会想到在方法执行前记录时间,方法执行后再次记录,得出运行的时间. 如果采用Spring的AOP,仅仅使用前置和后置方法是无法做到的,因 ...
- Spring实战(十一) 在Spring XML中配置AOP
如果你没有源码,不能为通知类添加注解,又不想将AspectJ注解放入到你的代码中,必须选择XML配置了. 1.Spring XML配置文件 解析参考:http://www.cnblogs.com/bi ...
- Spring实战(第4版).pdf - 百度云资源
http://www.supan.vip/spring%E5%AE%9E%E6%88%98 Spring实战(第4版).pdf 关于本书 Spring框架是以简化Java EE应用程序的开发为目标而创 ...
- Spring实战4:面向切面编程
主要内容 面向切面编程的基本知识 为POJO创建切面 使用@AspectJ注解 为AspectJ的aspects注入依赖关系 在南方没有暖气的冬天,太冷了,非常想念北方有暖气的冬天.为了取暖,很多朋友 ...
- SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- Spring实战(十)Spring AOP应用——为方法引入新功能、为对象引入新方法
切面最基本的元素是通知和切点,切点用于准确定位应该在什么地方应用切面的通知. 1.Spring借助AspectJ的切点表达式语言来定义Spring切面 在Spring中,要使用AspectJ的切点表达 ...
- Spring Boot → 11:项目实战-账单管理系统完整版
Spring Boot → 11:项目实战-账单管理系统完整版
- Spring实战 (第3版)——AOP
在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...
随机推荐
- HDU - 3336 next运用+递推
题目的匹配应该也要看成一个文本串与另一个模式串的匹配过程 Text是以当前i结尾的后缀来匹配Pattern的前缀(非真) 这里的Pattern肯定是可以匹配成功的,直接由next来保证(next总是当 ...
- Q443 压缩字符串
给定一组字符,使用原地算法将其压缩. 压缩后的长度必须始终小于或等于原数组长度. 数组的每个元素应该是长度为1 的字符(不是 int 整数类型). 在完成原地修改输入数组后,返回数组的新长度. 进阶: ...
- 可编辑的el-table表格,结合input输入,upload文件上传的表格
最近整理了一下,table表格的编辑状态,把一般表格里需要输入的类型都放进来了,实现的功能如图 这里面的input输入框没什么好说的,绑定对应的值就可以,要注意的是组件上传的upload,这个 ...
- request-statistics.lua
--[[ 实现请求统计,并且将单位时间内异常次数达到阀值的请求加入到黑名单中 --]] --获取共享内存 local limit_req_store = ngx.shared.limit_req_st ...
- 全网备份脚本rsync
一,服务端配置 #!/bin/sh ######################################################### #by:kingle # #use: confi ...
- 虚拟机xp系统中Oracle 10g的安装
1 安装过程(11步) 2.如果是xp系统可以直接并双击解压目录下的setup.ext,出现安装界面,如下: 3.输入口令和确认口令,如:oracle,点击下一步,出现如下进度条. 注:此口令即是管理 ...
- opensuse13.2国内源和设置命令
ustc-osshttp://mirrors.ustc.edu.cn/opensuse/distribution/13.2/repo/oss/ustc-non-osshttp://mirrors.us ...
- js event事件绑定的方法
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- MVC5 下拉框(多选)
1.Model [Display(Name = "职位")] [Required] public int[] job { get; set; } //职位属性 public IEn ...
- link快捷方式
ln -s 源文件 newfile -软连接 ln 源文件 newfile 硬链接 源文件删除之后仍然可以使用