SpringAOP基础
例1.已知有这么一段代码,会打印出Hello
public static void main(String[] args) {
sayHello();
}
public static void sayHello(){
System.out.print("Hello");
}
现在我们想打印出Java Hello world这个字符串,也就是在之前的Hello前后输出一点儿,所以写了如下代码:
public static void main(String[] args) {
System.out.print("Java ");
sayHello();
System.out.print(" World");
}
public static void sayHello(){
System.out.print("Hello");
}
这样,我们的问题就已经解决了,但是突然有一天,你们老板说,我不要打印Java,我想打印Python。那你就好办了啊,改下代码就好了么,可是突然,老板又想改成C,C++......这样一直改就不合适了吧。这时候你就要学习下AOP(面向切面编程)。
一、基础知识
1.在关aop的概念就不说了,直接从代码入手,慢慢过程中会说到。
2.AOP分为两种不同类型:静态AOP和动态AOP
静态AOP的意思就是:在编译期进行织入,就是说对切面进行的任何修改,都要进行重新编译程序。AspectJ就是一个典型的例子
- 这个织入就是一个基本概念,通白来说就是把代码插入到执行的地方。上边这个例子中就是在Hello前后多打印两句,这个过程的思想就是织入。
动态AOP:在代码执行过程中进行织入,它的切面代码不是编译进class文件中的。Spring AOP是一种动态AOP
二、使用AOP技术解决上边这个例子
基础代码不变(只不过少了静态而已,这个不影响,在代码中有解释)
public void sayHello(){
System.out.print("Hello");
}
然后创建一个实现AOP Alliance(Spring AOP接口)中类的接口的切面类
/**
* 实现环绕通知的接口
* 环绕通知就是在目标代码前后都会执行的
*/
public class MyInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
//之前
System.out.print("Java ");
//这一句就是执行目标代码
Object proceed = invocation.proceed();
//之后
System.out.print(" World");
return proceed;
}
}
最后在main中执行织入操作
public static void main(String[] args) {
//先创建执行目标类方法的对象
AOPDemo1 target = new AOPDemo1();
ProxyFactory proxyFactory = new ProxyFactory();
proxyFactory.addAdvice(new MyInterceptor());//这个MyInterceptor就是实现SpringAOP接口的类
proxyFactory.setTarget(target);
AOPDemo1 proxy = (AOPDemo1) proxyFactory.getProxy();
proxy.sayHello();
}
//因为没有用到类名调用,也不是在main中直接调用,所以不用加静态
public void sayHello() {
System.out.print("Hello");
}
这样,效果就和之前一样了。看不懂没关系,慢慢来。
SpringAOP基础的更多相关文章
- Spring知识点总结(四)之SpringAOP基础
1. Spring aop中的基本概念 • 连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候.在Spring AOP中,一个连接 ...
- SpringAOP 基础具体解释
Spring AOP对于刚開始学习spring的同学来说有点难以理解.我刚工作的时候都没怎么理解,如今略微理解了一点,所以在这里我将用嘴简单的样例,最通俗易懂的话语来说出我的理解,可能因为我对Spri ...
- SpringAOP基础 - 静态代理设计模式
代理模式在实现过程中,要创建一个接口(社交技巧-接口),代理类(经纪人 - 类)和真实类(范冰冰 - 类)同时实现这个接口. 举个例子: 我们想要找范冰冰吃饭,但是呢,她是大明星,不可能轻易见我们,我 ...
- Spring知识点总结(四)之SpringAOP基础 - 代理设计模式
1. 分析程序中存在的问题(高内聚,低耦合) 通过springIOC DI) 以及注解的使用,成功解决了在程序中层与层之间出现的耦合的问题,但是在很多地方仍然存在非该层应该实现的 ...
- SpringAOP之使用切入点创建通知
之前已经说过了SpringAOP中的几种通知类型以及如何创建简单的通知见地址 一.什么是切入点 通过之前的例子中,我们可以创建ProxyFactory的方式来创建通知,然后获取目标类中的方法.通过不同 ...
- spring事务详解(三)源码详解
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
- spring5 源码深度解析----- Spring事务 是怎么通过AOP实现的?(100%理解Spring事务)
此篇文章需要有SpringAOP基础,知道AOP底层原理可以更好的理解Spring的事务处理. 自定义标签 对于Spring中事务功能的代码分析,我们首先从配置文件开始人手,在配置文件中有这样一个配置 ...
- Spring学习记录3——Spring AOP
SpringAOP基础 AOP简介: AOP是Aspect Oriented Programing的简称,翻译为“面向切面编程”.它适用于具有横切逻辑的应用场合,如性能检测,访问控制,事务管理及日志记 ...
- Spring(11) - Introductions进行类扩展方法
Introductions(引用),在 Aspect 中称为类型间的声明,使切面能够声明被通知的对象(拦截的对象)实现给定的接口,并提供该接口的实现. 简单点说可以将一个类的实现方法复制到未实现的类中 ...
随机推荐
- Python 中如何实现参数化测试?
Python 中如何实现参数化测试? 之前,我曾转过一个单元测试框架系列的文章,里面介绍了 unittest.nose/nose2 与 pytest 这三个最受人欢迎的 Python 测试框架. 本文 ...
- <算法基础><排序>三种高级排序——快速排序,堆排序,归并排序
这三种排序算法的性能比较如下: 排序名称 时间复杂度(平均) 时间复杂度(最坏) 辅助空间 稳定性 快速排序 O(nlogn) O(n*n) O(nlogn) 不稳定 堆排序 O(nlogn) O(n ...
- Python正则表达式,看完这篇文章就够了...#华为云·寻找黑马程序员#【华为云技术分享】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/devcloud/article/detai ...
- 充满含金量的一场云原生Meetup,入场券免费发送中……
在武汉,你离这场云原生盛会,只有一步之遥 华为云.百度.斗鱼.海云基因,五位重量级专家 K8s调度.深度学习平台.斗鱼实战.基因大数据-五个干货议题 日,与您相约Cloud Native Days C ...
- springboot整合thymleaf模板引擎
thymeleaf作为springboot官方推荐使用的模板引擎,简单易上手,功能强大,thymeleaf的功能和jsp有许多相似之处,两者都属于服务器端渲染技术,但thymeleaf比jsp的功能更 ...
- springboot执行延时任务-DelayQueue的使用
DelayQueue简介 在很多场景我们需要用到延时任务,比如给客户异步转账操作超时后发通知告知用户,还有客户下单后多长时间内没支付则取消订单等等,这些都可以使用延时任务来实现. jdk中DelayQ ...
- acm模板总结
模板链接 字符串模板 KMP EXKMP Trie 可持久化Trie树+DFS序 01Trie Manacher 字符串哈希 2019上海网络赛G题 17 SA(后缀数组) 最大不重叠相似子串 求两 ...
- CodeForces999A-Mishka and Contest
A. Mishka and Contest time limit per test 1 second memory limit per test 256 megabytes input standar ...
- Linux源码编译安装httpd
Linux安装软件采用源码编译安装灵活自由,适用于不同平台,维护也十分方便. 源码编译的安装方式一般由3个步骤组成: 1.配置(configure) 2.编译(make) 3.安装(make inst ...
- JS-scrollTop、scrollHeight、clientTop、clientHeight、offsetTop、offsetHeight的理解
scrollTop, 可写(这些属性中唯一一个可写的元素) Element.scrollTop 属性可以获取或设置一个元素的内容垂直滚动的像素数. 一个元素的 scrollTop 值是这个元素的顶部到 ...