006Spring面向切面
01、基本术语---->POM中配置spring-aspects
1、通知(Advice)---->要做的事
前置通知(@Before)
后置通知(@After)
返回通知(@AfterReturning)
异常通知(@AfterThrowing)
环绕通知(@Around)
2、连接点(Join point)---->可能会应用通知的时机 3、切点(Pointcut)---->一个或多个连接点 4、切面(Aspect)---->通知+切点 5、引入(Introduction)---->向现有类添加新方法或属性 6、织入(Weaving)
编译期
类加载期
运行期---->Spring AOP
02、基本特性
只支持方法调用相关的连接点
基于动态代理(运行期织入)
03、Spring AOP所支持的AspectJ切点指示器
实际执行匹配
execution()
限制
args() 指定参数
@args() 指定参数注解
this()
target
@target()
within() 限制连接点类
@within()
@annotation
指示器连接符
&& || !
04、Spring AOP支持的bean()指示器
使用bean ID或名称作为参数来限制,只匹配特定的bean05、不处理参数的切面
开启自动代理
@Configuration
@EnableAspectJAutoProxy---->启动自动代理
@ComponentScan
public class ConcertConfig{
@Bean
public Audience audience(){---->切面
return new Audience();
}
}
某连接点
package concert;
public interface Performance{
public void perform();
}
@Aspect
public class Audience {
@Pointcut("execution(*concert.Performance.perform(..)) && within(concert.*)")---->定义命名的切点
public void performance(){}---->切点名称,仅供附着 @Before("performance()")
public void do1(){} @After("performance()")
public void do2(){} @Around("performance()")
public void do3(ProceedingJoinPoint jp){---->若函数本来有参数,jp参数要放在最左边
System.out.println("Before");
jp.proceed();---->可以不掉用,也可多次调用;若有返回值,在最后也该返回,以免影响原线程
System.out.println("After")
} @AfterReturning("performance()")
public void do4(){} @AfterThrowing("performance()")
public void do5(){} }
06、带参数切面
开启自动代理
...
某连接点
public class BlankDisc{
public void playTrack(int trackNumber){
...
}
}
切面
@Aspect
public class TrackCounter {
private Map<Integer, Integer> trackCounts = new HashMap<Integer, Integer>(); @Pointcut("execution(* soundsystem.CompactDisc.playTrack(int)) && args(trackNumber)")//使用args()在切点中声明参数,此参数将传递到通知中
public void trackPlayed(int trackNumber) {} @Before("trackPlayed(trackNumber)")
public void countTrack(int trackNumber){
int currentCount = getPlayCount(trackNumber);
trackCounts.put(trackNumber, currentCount + 1);
} public int getPlayCount(int trackNumber){
return trackCounts.containsKey(trackNumber)? trackCounts.get(trackNumber) : 0;
}
}
07、通过切面为Performance接口引入新功能
public interface Encoreable {
void performEncore();
}
@Aspect
public class EncoreableIntroducer {
@DeclareParents(value = "concert.Performance+", defaultImpl = DefaultEncoreable.class)
public static Encoreable encoreable;---->引入的接口
}
value---->指定哪种类型的bean引入此接口
defaultImpl---->指定为引入功能提供实现的类
@DeclareParents注解标注的静态属性指明要引入的接口
006Spring面向切面的更多相关文章
- 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)
面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法. 面向对象:ArrayList<Integer> list=new ArrayLis ...
- AOP 面向切面编程, Attribute在项目中的应用
一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...
- javascript面向切面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- AOP面向切面编程的四种实现
一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...
- spring入门(四)【面向切面编程】
开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...
- 面向切面编程AOP
本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...
- Spring-AOP面向切面编程
AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...
- AOP 面向切面编程
AOP http://blog.csdn.net/xiang_j2ee/article/details/6851963 Android 支持 AspectJ 这个库来实现面向切面编程. 使用 Apac ...
- 关于面向切面编程Aspect Oriented Programming(AOP)
最近学到spring ,出来了一个新概念,面向切面编程,下面做个笔记,引自百度百科. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实 ...
随机推荐
- POJ 2192
#include <iostream> #include <string> #define MAXN 500 using namespace std; bool dp[MAXN ...
- UI1
计算机工程系 目 录 实验一 Photoshop基本界面熟悉 3 实验二 PhotoShop常用工具的使用 4 实验三 图象和图层的处理 7 实验四 各种滤镜方式的处理 13 实验五 Ph ...
- Codeforces Round #556 (Div. 2)-ABC(这次的题前三题真心水)
A. Stock Arbitraging 直接上代码: #include<cstdio> #include<cstring> #include<iostream> ...
- Smarty <= 3.1.32 Remote Code execution(CVE-2017-1000480)
Smarty介绍 smarty是一个php模板引擎,其项目地址:https://github.com/smarty-php/smarty 测试环境搭建 下载:https://github.co ...
- [ZJOI2019]语言[树链的并、线段树合并]
题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的 ...
- Redis报错:redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snap
首先找到出现错误的原因: redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but ...
- SQL高效分页(百万条数据)
第一种方法:效率最高 SELECT TOP 页大小 * FROM ( SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber,* FROM table1 ...
- eclips中maven解决jsp报错的问题
加入如下的pom依赖: <!-- 解决jsp报错的依赖包第一个 --> <dependency> <groupId>javax.servlet</groupI ...
- CentOS6.4安装OpenSSL
1.下载 wget https://www.openssl.org/source/openssl-1.0.2h.tar.gz 2.解压 tar zxf openssl-1.0.2h.tar.gz cd ...
- 基于ASP.Net Core学习Docker技术第一步:在CentOS7安装Docker平台
Docker技术几年前就火了,伴随着今年来devops的流行,这项技术一直被技术社区追捧.提起Docker很容易被默认为是Linux平台下的技术,.NET的技术跟他似乎没有沾边,不过那是对非.NET ...