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面向切面的更多相关文章

  1. 面向过程(POP)、面向对象(OOP)、面向接口(IOP)、面向切面(AOP)

    面向过程:典型的是C/C++的结构体,结构体里只有变量,没有处理变量的方法,需要专门编写处理变量的方法. 面向对象:ArrayList<Integer> list=new ArrayLis ...

  2. AOP 面向切面编程, Attribute在项目中的应用

    一.AOP(面向切面编程)简介 在我们平时的开发中,我们一般都是面对对象编程,面向对象的特点是继承.多态和封装,我们的业务逻辑代码主要是写在这一个个的类中,但我们在实现业务的同时,难免也到多个重复的操 ...

  3. javascript面向切面

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. AOP面向切面编程的四种实现

     一.AOP(面向切面编程)的四种实现分别为最原始的经典AOP.代理工厂bean(ProxyFacteryBean)和默认自动代理DefaultAdvisorAutoProxyCreator以及Bea ...

  5. spring入门(四)【面向切面编程】

    开发过程中很多时候会用到日志.事务等操作,这些操作如果要写在业务代码中会相当麻烦,这时就会用到面向切面编程(AOP),AOP作为一种编程思想,和OOP有着不同的侧重点,面向对象侧重于万事万物皆对象,而 ...

  6. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

  7. Spring-AOP面向切面编程

    AOP是面向切面编程,区别于oop,面向对象,一个是横向的,一个是纵向. 主要解决代码分散和混乱的问题. 1.概念: 切面:实现AOP共有的类 通知:切面类中实现切面功能的方法 连接点:程序被通知的特 ...

  8. AOP 面向切面编程

    AOP http://blog.csdn.net/xiang_j2ee/article/details/6851963 Android 支持 AspectJ 这个库来实现面向切面编程. 使用 Apac ...

  9. 关于面向切面编程Aspect Oriented Programming(AOP)

    最近学到spring ,出来了一个新概念,面向切面编程,下面做个笔记,引自百度百科. Aspect Oriented Programming(AOP),面向切面编程,是一个比较热门的话题.AOP主要实 ...

随机推荐

  1. Spring Boot 笔记汇总

    使用IDEA搭建Spring Boot入门项目 从零开始完整搭建 Spring-Boot 项目开发框架的教程 IDEA通过Maven WebApp archetype 创建Spring boot项目骨 ...

  2. jinja url_for js 参数

    在JavaScript中,也就是客户端,向flask路由服务器端使用post请求并在url_for中传递参数,服务器端获取不到该参数, Jinja不能使用Javascript变量,如下所示: var ...

  3. mysql误删root用户

    在操作mysql时误删除root用户,如何进行恢复 在安装hive时候误删除root用户,存在的用户没有权限,解决方法如下. 1.首先在/etc/my.cnf文件中 mysqlID下面添加 skip- ...

  4. Android开发最佳实践

    Android开发最佳实践 摘要 ●使用 Gradle 和它推荐的工程结构 ●把密码和敏感数据放在gradle.properties ●不要自己写 HTTP 客户端,使用Volley或OkHttp库 ...

  5. 浏览器缓存如何控制? && 在url框中回车、F5 和 Ctrl + F5的区别是什么?

    第一部分: 浏览器缓存如何控制?   最近在做网站,但是不知道缓存是什么东西怎么能行! 如何实现HTTP缓存呢? 下面我们来一步一步的探寻实现机制把. 方案一: 无缓存   说明: 浏览器向服务器请求 ...

  6. Google发布移动网站设计原则

    Google 刚刚发布了由 Google 与 AnswerLab 联合打造,名为<Principles of Mobile Site Design: Delight Users and Driv ...

  7. 【Kafka】Broker之Server.properties的重要参数说明

    名称 描述 类型 默认值 有效值区间 重要程度 zookeeper.connect zk地址 string 高 advertised.host.name 过时的:只有当advertised.liste ...

  8. CentO7 安装 redis, 主从配置,Sentinel集群故障转移切换

        一.Redis的安装(前提是已经安装了EPEL)   安装redis: yum -y install redis 启动/停止/重启 Redis 启动服务: systemctl start re ...

  9. HDU 5444 Elven Postman (2015 ACM/ICPC Asia Regional Changchun Online)

    Elven Postman Elves are very peculiar creatures. As we all know, they can live for a very long time ...

  10. Ubuntu18.0.4配置Hadoop1.2.1环境

    在虚拟机中安装Linux,我这里选用VMware虚拟机:Linux版本是Ubuntu VMware安装Ubuntu这里就不做说明了,网上有很多教程 1.安装jdk apt install openjd ...