第三章 AOP
- 什么是AOP
- AOP的编写方式
什么是AOP?
是一种面向切面的思想,关注的是切面中的相似功能,将这些功能抽离出来,提高代码的复用性
AOP术语
advice-通知:要执行的任务
Spring切面有5种通知,Before、After、After-returning、After-throwing、Around
Joinpoint-连接点:
Pointcut-切点:
Aspect-切面:切面是通知和切点的结合
Introduction-引入:向现有的类添加方法或属性
Weaving-织入:将切面应用到目标对象来创建新的代理对象的过程
在目标对象的生命周期里有多个点进行织入
编译期:AspectJ
类加载期:
运行期:Spring AOP
如何表示切面?
| AspectJ指示器 | 描述 |
| arg() | 限制连接点匹配参数为指定类型的执行方法 |
| @args() | 限制连接点匹配参数由指定注解标注的执行方法 |
| execution() | 用于匹配是连接点的执行方法 |
| this() | 限制连接点匹配AOP代理Bean引用为指定类型的类 |
| target() | 限制连接点匹配目标对象为指定类型的类 |
| @target() | 限制连接点匹配特定的执行对象,这些对象对应的类要具备指定类型的注解 |
| within() | 限制连接点匹配指定的类型 |
| @within() | 限制连接点匹配指定注解所标注的类型 |
| @annotation | 限制匹配带有指定注解连接点 |
使用举例:
exection(* com.spring.User.say(..)) - 第一个*表示返回值类型 第一个..表示参数列表 *表示任意返回类型,..表示任意参数
exection(* com.spring.DD.say(..)) && within(com.spring.DD.*) - 两个指示器的交集,DD.* 表示DD类的任意方法
&& - 与;|| - 或;! - 非
bean(beanId) - 限定BeanId,这是Spring自己提供的指示器
可以使用XML和注解描述切面,XML方式繁琐,所以就使用注解
注解编写切面演示
1、编写切面
package demo02.part01; import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* Created by sherry on 17/1/11.
*/
@Aspect
public class AspectDemo { /**
* 日志
*/
private Logger logger = LoggerFactory.getLogger(AspectDemo.class); //Instruent类的任意返回类型,任意参数的play方法
@Pointcut("execution(* demo02.part01.Instruent.play(..))")
public void pointcutmathod(){} @Before("pointcutmathod()")
public void dd(){
logger.debug("Before");
}
}
2、配置切面
package demo02.part01; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; /**
* Created by sherry on 17/1/11.
*/
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("demo02")
public class SpringBean { @Bean
public AspectDemo aspectDemo(){
return new AspectDemo();
}
}
注意,一定要先使用@EnableAspectJAutoProxy打开AspectJ自动代理,否则无法使用切面
3、测试
package demo02.part01; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext; /**
* Created by sherry on 17/1/11.
*/
public class Main {
/**
* 日志
*/
private static Logger logger = LoggerFactory.getLogger(Main.class); public static void main(String[] args) {
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(SpringBean.class);
Instruent instruent = applicationContext.getBean(Instruent.class);
instruent.play(); }
} 10:09:23.392 [main] DEBUG demo02.part01.AspectDemo - Before
10:09:23.410 [main] DEBUG demo02.part01.Instruent - 执行 play
上述只是一个简单的演示
复杂的包括环绕通知、目标方法参数设置与获取,在环绕通知中获取方法名等都是能够实现的。遇到实际情况了再来补充说明
第三章 AOP的更多相关文章
- 第三章 AOP 基于@AspectJ的AOP
在前面,我们分别使用Pointcut.Advice.Advisor接口来描述切点.增强.切面.而现在我们使用@AdpectJ注解来描述. 在下面的例子中,我们是使用Spring自动扫描和管理Bean. ...
- 第三章 AOP 基于Schema的AOP
基于Schema定义的切面和前现两种方式定义的切面,内容上都差不多,只是表现形式不一样而已. 3.7.1一般增强的使用 a.目标类 public class Target { public void ...
- 第三章 AOP 编程选择
Spring为我们开发者提供了多种AOP的编程方式.我们该如何选择呢? 如果项目采用的是JDK5.0以上版本,我们可以选择@AspectJ的方式.这是第一选择. http://blog.csdn.ne ...
- 第6章 AOP与全局异常处理6.5-6.11 慕课网微信小程序开发学习笔记
https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 固有的处理异常的思维模式与流 ...
- spring第三章
第三章 实现AOP AOP:面向方面编程,AOP能够使您将所有模块共有的特性与应用程序的主要业务逻辑隔离开 一.AOP介绍 横切关注点:在Web应用程序中,有一些服务(如登录.安全和事务管理)不是应用 ...
- 《Django By Example》第三章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:第三章滚烫出炉,大家请不要吐槽文中 ...
- 《Linux内核设计与实现》读书笔记 第三章 进程管理
第三章进程管理 进程是Unix操作系统抽象概念中最基本的一种.我们拥有操作系统就是为了运行用户程序,因此,进程管理就是所有操作系统的心脏所在. 3.1进程 概念: 进程:处于执行期的程序.但不仅局限于 ...
- Python黑帽编程3.0 第三章 网络接口层攻击基础知识
3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP ...
- 《Entity Framework 6 Recipes》中文翻译系列 (11) -----第三章 查询之异步查询
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- linux redhat NFS网络共享搭建
nfs网络共享 测试环境: 服务端:redhat6.7 ip:192.168.1.100 客户端:redhat6.7 ip:192.168.1.110 一.服务端 1.创建共享文件夹 权限666即可 ...
- 快速创建一个vue项目
vue脚手架 用来创建vue项目的工具包 创建项目: npm install -g vue-cli vue init webpack VueDemo 开发环境运行: cd VueDemo npm in ...
- (转) 如何从 0 开始学 ruby on rails (漫步版)
原文:http://readful.com/post/12322300571/0-ruby-on-rails ruby 是一门编程语言,ruby on rails 是 ruby 的一个 web 框架, ...
- dsp6657的串口学习
1. 打算用dsp6657学习下,先用串口实验吧.找一下芯片支持库Chip support libraries,路径D:\ti\pdk_C6657_1_1_1_4\packages\ti\csl,新建 ...
- python学习五
打包代码与数据 数据结构要与数据匹配,数据结构影响代码的复杂性 列表 集合 字典 #创建与初始化 cleese={} cleese2=dict() cleese["name"] ...
- 2019年猪年海报PSD模板-第二部分
14套精美猪年海报,免费猪年海报,下载地址:百度网盘,https://pan.baidu.com/s/1sH0U5oU-LQlaxnaWxPCrrg
- hdu1045Fire Net(经典dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- APP九宫格滑动解锁的处理
写手机自动化测试脚本关于APP九宫格滑动解锁方面采用了appium API 之 TouchAction 操作. 先是用uiautomatorviewer.bat查询APP元素坐标: 手工计算九宫格每个 ...
- EditorGUI控件输入监听
EditorGUI控件输入监听 在做编辑器开放的过程中,有时候要对用户输入进行判断和限制,但EditorGUI控件却没有触发回调,而是提供了一种麻烦的办法--使用EditorGUI.BeginChan ...
- java字符转义
之前对java字符转义这一块稍作了解,在这里理理自己主观浅显的理解 这里会谈谈字符编码的是另一种问题和转义没有关系 以下面代码做分析 System.out.println("a". ...