Spring AOP本质(7)
* 业务组件
*/
public class SampleBean {
public void foo(int x) {
System.out.println("SampleBean的foo(int x)方法被调用,参数x=" +x);
}
public void bar() {
System.out.println("SampleBean的无参bar()方法被调用!");
}
}
import org.springframework.aop.ClassFilter;
import org.springframework.aop.support.DynamicMethodMatcherPointcut;
/**
* 自定义动态切入点:Pointcut
*/
public class SimpleDynamicPointcut extends DynamicMethodMatcherPointcut {
/**
* 重写了静态方法匹配器
*/
public boolean matches(Method method, Class cls) {
System.out.println("SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:" + method.getName());
//仅当方法名为foo时候才匹配
return ("foo".equals(method.getName()));
}
/**
* 实现了动态方法匹配器
*/
public boolean matches(Method method, Class cls, Object[] args) {
System.out.println("SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:" + method.getName());
int x = ((Integer) args[0]).intValue();
//仅当方法参数为不等于100才匹配
return (x != 100);
}
/**
* 重写了类匹配器
*/
public ClassFilter getClassFilter() {
return new ClassFilter() {
public boolean matches(Class cls) {
System.out.println("SimpleDynamicPointcut:切入点类匹配,正在匹配"+cls.getName()+"类!");
return (cls == SampleBean.class);
}
};
}
}
* 自定义通知:Advice
*/
public class SimpleAdvice implements MethodInterceptor {
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println(">> 业务方法调用前动作,被代理调用目标方法是: " + invocation.getMethod().getName());
Object retVal = invocation.proceed();
System.out.println(">> 业务方法调用结束后动作!");
return retVal;
}
}
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.DefaultPointcutAdvisor;
import com.apress.prospring.ch6.staticpc.SimpleAdvice;
/**
* 动态方法匹配器切入点:客户端测试
*/
public class DynamicPointcutExample {
public static void main(String[] args) {
//创建目标对象
SampleBean target = new SampleBean();
// 创建通知者
Advisor advisor = new DefaultPointcutAdvisor(
new SimpleDynamicPointcut(), new SimpleAdvice());
//创建代理工厂
ProxyFactory pf = new ProxyFactory();
//将目标加入工厂
pf.setTarget(target);
//创建通知者
pf.addAdvisor(advisor);
//获取代理实例(产品)
SampleBean proxy = (SampleBean)pf.getProxy();
//调用代理方法,注意参数的变化
proxy.foo(1);
proxy.foo(10);
proxy.foo(100);
proxy.bar();
proxy.bar();
proxy.bar();
}
}
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:bar
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:hashCode
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:toString
SimpleDynamicPointcut:切入点类匹配,正在匹配com.apress.prospring.ch6.dynamicpc.SampleBean类!
SimpleDynamicPointcut:静态方法匹配器正在尝试匹配方法:foo
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
>> 业务方法调用前动作,被代理调用目标方法是: foo
SampleBean的foo(int x)方法被调用,参数x=1
>> 业务方法调用结束后动作!
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
>> 业务方法调用前动作,被代理调用目标方法是: foo
SampleBean的foo(int x)方法被调用,参数x=10
>> 业务方法调用结束后动作!
SimpleDynamicPointcut:动态方法匹配器正在尝试匹配方法:foo
SampleBean的foo(int x)方法被调用,参数x=100
SampleBean的无参bar()方法被调用!
SampleBean的无参bar()方法被调用!
SampleBean的无参bar()方法被调用!
Process finished with exit code 0
Spring AOP本质(7)相关推荐
- Spring AOP 本质(3)
Spring AOP 本质(3) Spring AOP很牛,AOP是OOP的补充,而非竞争者. 前面的例子离实际的应用太遥远.不足以显式AOP的力量,现在就用AOP前置通知来检查用户的身份,只有通过检 ...
- Spring AOP 本质
AOP本质是拦截,拦截的本质是代理,代理分动态和静态,静态代理很简单,功能有限,应用不是很广泛,Spring中主要用的动态代理. 用Spring做开发,AOP的实现仅仅是编程实现一些接口,然后配置 ...
- 《Spring揭秘》读书笔记 2:Spring AOP
7 一起来看AOP 2009年8月,<一起来看流星雨>开播. 2009年9月,<Spring揭秘>出版. 7.1 AOP核心概念 AOP AOP全称为Aspect-Orient ...
- Spring Aop 常见注解和执行顺序
欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/7062506923194581029 Spring 一开始最强大的就是 IOC / AOP 两 ...
- 彻底理解Spring AOP
目录 前言 1. AOP概念 2. AOP的实现 3. Spring的IoC理解: 4. Sping知识整理 前言 AOP英文名为Aspect Oriented Programming,意为面向切面编 ...
- (转)Spring AOP的底层实现技术
AOP概述 软件的编程语言最终的目的就是用更自然更灵活的方式模拟世界,从原始机器语言到过程语言再到面向对象的语言,我们看到编程语言在一步步用更自然.更强大的方式描述软件.AOP是软件开发思想的一个飞跃 ...
- Spring AOP中定义切点(PointCut)和通知(Advice)
本文讨论一下Spring AOP编程中的两个关键问题,定义切点和定义通知,理解这两个问题能应付大部分AOP场景. 如果你还不熟悉AOP,请先看AOP基本原理,本文的例子也沿用了AOP基本原理中的例子. ...
- 9000+ 字,彻底征服 Spring AOP ,美滋滋
基本知识 其实, 接触了这么久的 AOP, 我感觉, AOP 给人难以理解的一个关键点是它的概念比较多, 而且坑爹的是, 这些概念经过了中文翻译后, 变得面目全非, 相同的一个术语, 在不同的翻译下, ...
- Spring AOP概述及底层实现原理
Spring AOP概述及底层实现原理 aop概述 AOP全称为Aspect Oriented Programming的缩写,意为:面向切面编程.将程序中公用代码进行抽离,通过动态代理实现程序功能的统 ...
最新文章
- TCP/IP详解学习笔记(12)-TCP的超时与重传
- 【FPGA教程案例2】基于vivado核的NCO正弦余弦发生器设计与实现
- EL之Bagging(DTR):利用Bagging对回归问题(实数值评分预测)建模(调2参)
- 美链BEC合约漏洞技术分析
- android上传文件php,PHP编写安卓文件上传接口
- 380天!理想汽车交付量突破30000辆
- python epub转txt_怎么将很多个TXT合并成epub?
- niceScroll相关配置参数
- 读书笔记-互联网鲇鱼法则
- Java中如何将中文转换为英文String
- iOS 实现二维码的彩色效果
- 浙江大学2020计算机考研复试线,浙江大学2020考研复试分数线已公布
- 谷歌开始卷自己,AI架构Pathways加持,推出200亿生成模型
- 网络编程:网络协议简介
- 【文章阅读】【超解像】--Residual Dense Network for Image Super-Resolution
- 模块学习(五)——矩阵键盘
- 【信号系统实验2】MATLAB—连续时间信号与系统的频域分析
- 【Skill】从 WPS 步入Office 365
- 【强化学习】DDPG(Deep Deterministic Policy Gradient)算法详解
- 支付宝手机网页即时到账接口(3)之交易接口请求
热门文章
- 软硬链接、文件删除原理、linux中的三种时间、chkconfig优化
- ZZNU 1993: cots' friends
- unittest笔记
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
- 支付宝支付 第五集:二维码生成工具
- xcode新版本single view_动态数组函数系列1|概况-跟以往Excel版本完全不一样玩法的函数...
- linux将字符串转小写_Python教程第10讲:字符串的使用
- 成都郫县php开发学校_成都各区九年制学校、十二年制学校汇总
- python lambda函数_python入门基础之lambda匿名函数
- hive查看表中列的信息命令_快速了解hive