文章目录

  • AOP的一些名词
  • AOP具体实现

AOP的一些名词

连接点:类中可以被增强的方法
切入点:类中实际被增强的方法
通知:实际增强方法的部分
切面:把通知应用到切入点的过程
其中通知常用的有前置通知,后置通知,环绕通知

AOP具体实现

Spring AOP是基于AspectJ实现的,所以需要先引入依赖

<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>

这里我们通过注解来实现,所以开启注解,然后开启注解扫描的包,同时开启Aseptic生成代理对象

<!--    开启注解支持-->
<context:annotation-config/>
<!--    配置要扫描的包下的注解生效-->
<context:component-scan base-package="com.hzy.aopanno"/>
<!--    开启Aspect生成代理对象-->
<aop:aspectj-autoproxy/>

准备工作做的差不多了,可以开始应用了,如果我们要对User类下的add方法加一个前置通知,也就是执行该方法前执行的操作,首先创建一个User类,并把该类注入到Spring

package com.hzy.aopanno;import org.springframework.stereotype.Component;@Component
public class User {public void add() {System.out.println("add ...");}
}

然后是一个User的代理类,也就是负责通知的,这里的@Aspect就是切面,把该通知应用到切入点,其中execution(* com.hzy.aopanno.User.add(..))代表对add方法进行切入,如果所有的方法切人是execution(* com.hzy.aopanno.User.*(..))

package com.hzy.aopanno;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Component
@Aspect
public class UserProxy {@Before(value = "execution(* com.hzy.aopanno.User.add(..))")public void before() {System.out.println("before ...");}
}

下面我们测试一下

import com.hzy.aopanno.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");User user = context.getBean("user", User.class);user.add();}
}


然后我们再进行演示after和around
修改代理类

package com.hzy.aopanno;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Component
@Aspect
public class UserProxy {@Before(value = "execution(* com.hzy.aopanno.User.add(..))")public void before() {System.out.println("before ...");}@After(value = "execution(* com.hzy.aopanno.User.add(..))")public void after() {System.out.println("after ...");}@Around(value = "execution(* com.hzy.aopanno.User.add(..))")public void around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {System.out.println("环绕之前 ...");proceedingJoinPoint.proceed();System.out.println("环绕之后 ...");}
}

观察测试结果会发现,在before之前会环绕,after之前也会环绕

Spring中AOP注解实现相关推荐

  1. spring中自定义注解(annotation)与AOP中获取注解___使用aspectj的@Around注解实现用户操作和操作结果日志

    spring中自定义注解(annotation)与AOP中获取注解 一.自定义注解(annotation) 自定义注解的作用:在反射中获取注解,以取得注解修饰的类.方法或属性的相关解释. packag ...

  2. spring中aop事务

    文章目录 事务 为什要用到Spring中AOP事务 事物的特性 ACID 事务并发问题 事务的隔离级别 spring事务管理 事务操作 事务操作对象 spring管理事务的属性介绍 spring管理事 ...

  3. Spring中异步注解@Async的使用、原理及使用时可能导致的问题

    前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...

  4. Spring中常用注解的介绍

    spring中使用注解时配置文件的写法: <?xml version="1.0" encoding="UTF-8"?> <span style ...

  5. 声明式事务、Spring 中常用注解、Ajax

    五. 声明式事务 编程式事务: 1.1 由程序员编程事务控制代码. 1.2 OpenSessionInView 编程式事务 声明式事务: 先引入依赖 <dependency><gro ...

  6. spring中AOP(面向切面编程)

    spring中AOP(面向切面编程) 面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软件开发中的一个热点,也是spring框架中的一个重要内容 ...

  7. spring中的注解和xml配置文件中配置对应总结

    spring中的注解和xml配置文件中配置对应 需要导入的jar spring-context spring-context-support spring-test commons-logging b ...

  8. Spring 中所有注解

    Spring中的注解主要分为两类: 类级别的注解: 如@Component.@Repository.@Controller.@Service以及JavaEE6的@ManagedBean和@Named注 ...

  9. Spring中AOP源码剖析

    Spring中AOP源码剖析 关键词 aop的增强发生在后置处理器中(没有循环依赖) 最终增强是通过 递归调用 ,层层增强 一.环境准备 1.1 bean和接口 public class AopBea ...

最新文章

  1. ballerina 学习二十九 数据库操作
  2. sega+model+3+android,世嘉MODEL2经典老游戏移植登场 追加联网对战
  3. Python的流程控制 - for序列
  4. 12层打败50层,ParNet 普林斯顿+英特尔:更深不一定更好
  5. python水仙花数总结_python打印n位数“水仙花数”(实例代码)
  6. div+css+js 树形菜单
  7. Tomcat修改源码,重新编译
  8. 在Kibana上查看tomcat日志
  9. 苹果Mac智能照片编辑软件:​​​​Movavi Picverse
  10. Search in Rotated Sorted Array II leetcode java
  11. Virident:PCIe SSD更能发挥闪存的特长
  12. 在线教育开源 java_新款SpringBoot在线教育平台开源了
  13. 华为4g显示无服务器,华为nova5 插卡无4G
  14. Win11录屏方法介绍
  15. 大厂员工涌入外包:中年失业,外包已是我最好的选择
  16. 瑞斯康达olt排查故障的常用命令
  17. 基于DINet的虚拟数字人
  18. 根据出行月份(1~12)和仓位(头等舱1,经济舱2)输出实际机票价格。
  19. 红帽与Cloudera结成大数据联盟 释放企业级Hadoop潜能
  20. MySQL面试题学习笔记

热门文章

  1. MyEclipse10 中的两种FreeMarker插件的安装与配置
  2. async 和 await 关键字
  3. 为.NET程序批上WPF的绚丽外衣(1)
  4. 谁将掌控中国的金融?(上)
  5. BZOJ.1029.[JSOI2007]建筑抢修(贪心)
  6. openssl req
  7. eclipse集成python插件
  8. eclipse安装cppcheck
  9. R语言计算相关矩阵然后将计算结果输出到CSV文件
  10. 使用Struts2开发Java Web应用程序(目录)