第三章 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>来学习,请看本系列开篇 第三章 查询 前一章,我们展示了常见数据库场景的建模方式,本章将向你展示如何查询实体 ...
随机推荐
- Node.js的Formidable模块的使用,方便快捷
服务用的是express ,如果不是很老的express框架,都有自带formidable 如果没有就下载一个 npm i formidable var formidable = require( ...
- BZOJ1924_所驼门王的宝藏_KEY
题目传送门 这道题苟了我好久,因为链表的内存问题,之后再细讲. 首先这是一道Tarjan+DAG上DP的题目. 有三种门,对于每种门可以和其他门相连.即连边. 使用链表快速查询连边. 建完图后可以进行 ...
- 成都Uber优步司机奖励政策(2月29日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- Ruby 基础教程 1-2
1.数组 创建 arrayname=[] arrayname=["1",12,"23"] 访问 arrayname[index] 更新 arrayname[in ...
- Python简要标准库(1)
sys sys这个模块让你能够访问与Python解释器联系紧密的变量和函数 其中的一些在下表 F argv 命令行参数,包括脚本名称 exit([arg]) 退出当前的程序,可选参数为给定的返回值或者 ...
- Java开发工程师(Web方向) - 03.数据库开发 - 第4章.事务
第4章--事务 事务原理与开发 事务Transaction: 什么是事务? 事务是并发控制的基本单位,指作为单个逻辑工作单元执行的一系列操作,且逻辑工作单元需满足ACID特性. i.e. 银行转账:开 ...
- TW实习日记:第16天
前端的样式bug实在是太太太莫名其妙了,尤其是封装好的组件,一层套一层的,根本不知道是哪一层出了问题...除了改bug就是做新功能,真想吐槽一下这个项目的留言板,根本没人会用吧...这功能实在是太老旧 ...
- lintcode 平面列表
问题描述: 给定一个列表,该列表中的每个要素要么是个列表,要么是整数.将其变成一个只包含整数的简单列表. 样例: 给定 [1,2,[1,2]],返回 [1,2,1,2]. 给定 [4,[3,[2,[1 ...
- python3-声音处理
先来说下二进制读写文件,这需要struct库 #二进制文件读写 import struct a= b=- # print(struct.pack("h",b)) # print(s ...
- python计算工资个税
# -*- coding: utf-8 -*- total = int(input("税前总计:")) #公积金10% Gongjijin = total * 0.1 print( ...