Spring使用@AspectJ开发AOP(零配置文件)
前言:
AOP并不是Spring框架特有的。Spring只是支持AOP编程 (面向切面编程) 的框架之一。
概念:
1、切面(Aspect)
一系列Advice + Pointcut 的集合。
2、通知(Advice)
通知是切面开启后,切面的方法。
- 前置通知 ( before ):在动态代理反射原有对象方法 或者 执行环绕通知 前 执行的通知功能
- 后置通知(after):在动态代理反射原有对象方法 或者 执行环绕通知 后 执行的通知功能
- 返回通知 (afterReturning):在动态代理反射原有对象方法 或者 执行环绕通知 后 正常返回(无异常)执行的通知功能
- 异常通知(afterTherowing):在动态代理反射原有对象方法 或者 执行环绕通知 产生异常后执行的通知功能
- 环绕通知(around):在动态代理中,它可以取代当前被拦截对象的方法,提供回调原有被拦截对象的方法
3、引入(Introduction)
引入允许我们在现有的类里添加自定义的类和方法
4、切点(Pointcut)
这是一个告诉Spring AOP 在什么时候启动拦截并织入对应的流程,因为并不是所有的开发都是需要启动AOP的,它往往通过正则表达进行限定
5、连接点( join point)
Pointcut 中的某个具体位置。
首先要有 AspectJ 的依赖

<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
现在我们去创建一个Cat 类 (目标类)出来,并使用@Component 注入容器中
import org.springframework.stereotype.Component; //目标类
@Component
public class Cat { public void eat(){
System.out.println("小白猫,开始吃鱼了!!!!");
}
}
然后再创一个 切面类 出来
@Component
@Aspect
public class CatAdvice {//切面类 //execution (* *.*(..) )
// 第一个* 代表着 返回类型是任意的
// 第二个* 代表着 类的全限定名 * 代表着所有
// *(..) 代表着 任意方法 任意的参数
// 比如 execution ( void com.oukele.learning.aop2.Cat.eat()) //切点
@Pointcut("execution(* *.*(..))")
public void pointcut(){}; @Before("pointcut()")
public void clean(){//在猫吃之前执行的方法 ,把鱼清洗一下 (前置通知)
System.out.println("现在我们把我这条鱼,清洗一下");
} @After("pointcut()")
public void tidy(){//猫吃完鱼后执行的方法,收拾一下剩下的残渣 (后置通知)
System.out.println("收拾,小白猫吃剩下来的残渣。!!!");
} }
再创一个配置类
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy; @Configuration//声明当前类是配置类 ( 类似于 xml 文件一样 )
@ComponentScan(basePackages = "com.oukele.learning.aop2")//扫描某个包中的注解
@EnableAspectJAutoProxy//激活 代理功能
public class SpringConfig { }
现在开始测试啦
public class Main {
    public static void main(String[] args) {
        //加载配置类
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
        //从容器中获取Cat类
        Cat cat = context.getBean(Cat.class);
        cat.eat();//调用Cat类的方法
    }
}
结果:
现在我们把我这条鱼,清洗一下
小白猫,开始吃鱼了!!!!
收拾,小白猫吃剩下来的残渣。!!!
只要我们把切面类里面的@Componet去掉,就会发现,这只猫,是直接吃鱼的。

这就是面向切面编程。。。。
代码示例下载:https://github.com/oukele/Spring-AspectJ-Annotion
Spring使用@AspectJ开发AOP(零配置文件)的更多相关文章
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring使用AspectJ开发AOP基于XML和基于Annotation
		AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言.Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 Aspe ... 
- Spring使用AspectJ开发AOP:基于XML
		基于XML的声明式 基于 XML 的声明式是指通过 Spring 配置文件的方式定义切面.切入点及声明通知,而所有的切面和通知都必须定义在 <aop:config> 元素中. 下面通过案例 ... 
- Spring使用AspectJ开发AOP:基于Annotation
		基于 Annotation 的声明式 在 Spring 中,尽管使用 XML 配置文件可以实现 AOP 开发,但是如果所有的相关的配置都集中在配置文件中,势必会导致 XML 配置文件过于臃肿,从而给维 ... 
- (转)Spring使用AspectJ进行AOP的开发:注解方式
		http://blog.csdn.net/yerenyuan_pku/article/details/69790950 Spring使用AspectJ进行AOP的开发:注解方式 之前我已讲过Sprin ... 
- Spring 基于 AspectJ 的 AOP 开发
		Spring 基于 AspectJ 的 AOP 开发 在 Spring 的 aop 代理方式中, AspectJ 才是主流. 1. AspectJ 简介 AspectJ 是一个基于 java 语言的 ... 
- Spring整合AspectJ的AOP
		学而时习之,不亦说乎! --<论语> 看这一篇之前最好先看前面关于AOP的两篇. http://www.cnblogs.com/z ... 
- [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.
		前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ... 
- Spring基于AspectJ的AOP的开发——注解
		源码:https://gitee.com/kszsa/dchart 一, AspectJ的概述: AspectJ是一个面向切面的框架,它扩展了Java语言.AspectJ定义了AOP语法所以它有一个专 ... 
- Spring框架中的AOP技术----配置文件方式
		1.AOP概述 AOP技术即Aspect Oriented Programming的缩写,译为面向切面编程.AOP是OOP的一种延续,利用AOP技术可以对业务逻辑的各个部分进行隔离,从使得业务逻辑各部 ... 
随机推荐
- VisualBasic文件与目录管理FileSystem 类
			注解 下表列出了涉及 My.Computer.FileSystem 对象的任务示例. 功能 查看 从文本文件读取 如何:读取文本文件 从带分隔符的文本文件中读取 如何:读取逗号分隔的文本文件 从固定宽 ... 
- 海量数据和高并发下的 Redis 业务优化实践
			本文内容是我在 6 月 23 日参加的深圳 GIAC 技术大会上演讲的文字稿. 观众朋友们,我是来自掌阅的工程师钱文品,掘金小册<Redis 深度历险>的作者.今天我带来的是分享主题是:R ... 
- PTA(Basic Level)1028.人口普查
			某城镇进行人口普查,得到了全体居民的生日.现请你写个程序,找出镇上最年长和最年轻的人. 这里确保每个输入的日期都是合法的,但不一定是合理的--假设已知镇上没有超过 200 岁的老人,而今天是 2014 ... 
- 使用CompletableFuture进行异步任务编排
			1.JDK5引入了Future进行异步任务的处理,Future 的接口主要方法有以下几个: (1)boolean cancel (boolean mayInterruptIfRunning) 取消任务 ... 
- 批量删除Maven本地仓库中未下载完成的jar包(不完整的jar包)
			1.删除repository库目录下所有后缀名是.lastUpdated的文件 2.进入maven本地仓库地址: CMD进入windows的路径(或在仓库目录的地址栏直接输入CMD,回车自动打开); ... 
- # 江西ccpc省赛-waves-(DP做法)
			江西ccpc省赛-waves-(DP做法) 题链:http://acm.hdu.edu.cn/showproblem.php?pid=6570 题意:给你长度为N,1≤N≤100000的一个数组,其中 ... 
- 02:linux常用命令
			1.1 linux查看系统基本参数常用命令 1.查看磁盘 [root@linux-node1 ~]# df -hl Filesystem Size Used Avail Use% Mounted on ... 
- jinja2介绍
			jinja2介绍 jinja2是Flask作者开发的一个模板系统,起初是仿django模板的一个模板引擎,为Flask提供模板支持,由于其灵活,快速和安全等优点被广泛使用. jinja2的优点 jin ... 
- js注册实现
			<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ... 
- c# 简单打开关闭摄像头
			const short WM_CAP = 1024; const int WM_CAP_DRIVER_CONNECT = WM_CAP + 10; const int WM_CAP_DRIVER_DI ... 
