博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring使用@AspectJ开发AOP(零配置文件)
阅读量:3933 次
发布时间:2019-05-23

本文共 2311 字,大约阅读时间需要 7 分钟。

 

前言:

 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 的依赖 

org.aspectj
aspectjweaver
1.9.2

现在我们去创建一个Cat 类 (目标类)出来,并使用@Component 注入容器中

复制代码
import org.springframework.stereotype.Component;//目标类@Componentpublic class Cat {    public void eat(){        System.out.println("小白猫,开始吃鱼了!!!!");    }}
复制代码

然后再创一个 切面类 出来

复制代码
@Component@Aspectpublic 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类的方法    }}
复制代码

结果:

1 现在我们把我这条鱼,清洗一下2 小白猫,开始吃鱼了!!!!3 收拾,小白猫吃剩下来的残渣。!!!

 只要我们把切面类里面的@Componet去掉,就会发现,这只猫,是直接吃鱼的。

这就是面向切面编程。。。。

代码示例下载:

 
 
 
 
 
 
 
posted @ 2018-12-28 15:33 阅读(...) 评论(...)

转载地址:http://cahgn.baihongyu.com/

你可能感兴趣的文章
关闭spring boot jackson的FAIL_ON_EMPTY_BEANS
查看>>
java7的新特性
查看>>
Java8内存模型—永久代(PermGen)和元空间(Metaspace)
查看>>
java5、java6、java7、java8的新特性
查看>>
mysql中jpa开发针对BLOB字段的update问题
查看>>
微服务系统下Session登录问题记录
查看>>
mac系统如何生成SSH key与GitHub通信
查看>>
AES对称加密,以及javax.crypto.BadPaddingException: Given final block not properly padded 解决
查看>>
java加密——Jasypt开源工具包
查看>>
Spring cloud项目中MethodValidationPostProcessor拦截器与自定义拦截器
查看>>
序列化对象互转--Jackson中的ObjectMapper,解决超类派生问题,序列化问题
查看>>
swagger的API自动生成文档、自动生成其他语言请求文档、所有请求导入postman
查看>>
(转)给大数据分析师的一双大礼:Apache Kylin和Superset
查看>>
spring 嵌套事务
查看>>
Linux 查看CPU信息,机器型号,内存等信息
查看>>
webSocket-Java开发总结
查看>>
ELK原理与介绍(转)
查看>>
Ubuntu中支持yum命令(转)
查看>>
ubuntu navicat安装,破解使用;以及设置系统启动自动执行脚本(转)
查看>>
Ubuntu16.04.1 安装Nginx
查看>>