spring Aop 注解

Aop 术语

AOP 的特性术语,不同的翻译还会不一样,得在过程中理解

  • 横切关注点:跨越程序多个模块的方法或功能。即与业务逻辑无关,但我们也要关注的部分,就是横切关注点。如日志、安全、缓存等。
  • 切面( Aspect ):横切关注点被模块化的特殊对象;即切面应是一个类。
  • 通知( Advice):切面要完成的增强处理,通知描述了切面何时执行以及如何执行增强处理;即通知应是切面中的方法。
  • 目标( Target ):被通知对象。
  • 代理( Proxy ):向目标对象应用通知之后创建的对象。
  • 切入点( PointCut ):切面通知执行的地点,即可以插入增强处理的连接点。
  • 连接点( JoinPoint ):应用执行过程中能够插入切面的一个点,这个点可以是方法的调用、异常的抛出。
  • 织入( Weaving ):将增强处理添加到目标对象中,并创建一个被增强的对象,这个过程就是织入

Spring Aop 通知

Spring中有五种通知 Advice

  • @Before 前置通知:方法执行之前
  • @After 后置通知:方法执行之后
  • @Around 环绕通知:方法执行前后都有通知
  • @AfterReturnning 返回通知:方法成功执行之后通知
  • @AfterThrowing 异常通知:抛出异常之后通知

举例

加入依赖

 <dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.6</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.6</version>
</dependency>

业务类

@Component
public class User {public void sayHi(String name) {System.out.println(">>> user hi: " + name);}
}

定义切面

@Aspect
@Component
public class UserAspect {@Pointcut("execution(public * com.x.z..*.*(..))")public void pointCut() {}@Before("pointCut()")public void before() {System.out.println("before advice...");}@After("pointCut()")public void after() {System.out.println("after advice...");}@Around("pointCut()")public Object around(ProceedingJoinPoint pjp) throws Throwable {System.out.println("around advice before...");Object proceed = pjp.proceed();System.out.println("around advice after...");return proceed;}@AfterReturning(value = "pointCut()")public void afterReturning() {System.out.println("AfterReturning advice...");}@AfterThrowing(value = "pointCut()")public void afterThrowing() {System.out.println("AfterThrowing advice...");}}@Configuration
@EnableAspectJAutoProxy   //一定加的注解, 不然切面不生效
@Import({UserAspect.class, User.class})
public class UserConfig {}

AnnotationConfigApplicationContext 加载切面

public class UserAopTest {@Testpublic void userAspectTest(){ApplicationContext act = new AnnotationConfigApplicationContext(UserConfig.class);User user = act.getBean(User.class);user.sayHi("小明");}
}

结果

around advice before...
before advice...
>>> user hi: 小明
AfterReturning advice...
after advice...
around advice after...

Aop执行切面源码

很明显,我这个是类代理,所以进入 DynamicAdvisedInterceptor

获取增强链:

aop 流程:

  • DynamicAdvisedInterceptor.intercept()
  • 获取目标对象 TargetSource targetSource = this.advised.getTargetSource()
  • 获取通知链 List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass)
  • 递归调用 通知增强
  • 执行目标方法

AOP 原理

一句话: 生成代理对象,使用责任链式方式调用通知链执行增强方式,最后执行目标方法,达到增强目的

spring aop 注解相关推荐

  1. Spring AOP注解方式实现

    简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文 ...

  2. Spring AOP注解为什么失效?90%Java程序员不知道

    转载自 Spring AOP注解为什么失效?90%Java程序员不知道 使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方 ...

  3. java spring aop 注解包_Spring AOP 注解配置实例

    Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1 ...

  4. spring AOP注解失效原因

    目录 @Transactional @Async等注解不起作用 JDK动态代理 Spring AOP注解失效原因及解决 原因1:同一个类中,方法A调用方法B(方法B上加有注解),注解无效 原因2:AO ...

  5. spring AOP注解含义

    spring AOP 的几个注解含义 @Aspect                                                              指定一个类为切面类 @P ...

  6. spring AOP注解实现

    一.什么是AOP 引用一下维基百科的定义 面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计.剖面导向程序设计)是计算机科学中的一种程序设计思 ...

  7. Spring AOP注解

    1.配置 <!-- 配置spring创建容器时要扫描的包--><context:component-scan base-package="com">< ...

  8. spring注解:spring aop注解详解

    一. AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式 JointPoint(连接点) ...

  9. 初学spring aop 注解遇到的问题

    初学spring,对spring注解这块了解不是很多,现在注解替代了xml配置文件,原来的bean id 去哪里了呢? //@Service//默认类名 @Service("rmb" ...

最新文章

  1. mysql repalication_MySQL主从复制的原理及配置方法(比较详细)
  2. 主题模型(topic models)总结
  3. java 取cpuid、主板id、硬盘id、mac地址
  4. 学习Kotlin(四)对象与泛型
  5. ORACLE的所有字段类型
  6. 停课不停学,优酷直播如何将网课点名延迟降到0.6s?
  7. python的变量的命名规则以及定义
  8. IE选项中的高级选项卡“启用内存保护帮助减少联机攻击”是灰色的,不能把前面的勾选取消掉
  9. mysql.proc_升级后直接更改mysql.proc表
  10. POI导出Excel2003
  11. 文档大小超出上传限制怎么办_一键PDF转Word、PPT、图片等文档,这才是办公族必备的效率神器!...
  12. 一个崭新的华为交换机配置
  13. java 定时任务 cron
  14. Charles 模拟慢网络
  15. linux去除快捷方式箭头,焦点去除Win8快捷方式箭头软件
  16. 机器学习-初级进阶(Thompson 抽样算法 )
  17. class_view_decorate
  18. 2014matlab精度设置,matlab设置数据精度
  19. 怎么发现不了同一网络的其他计算机,局域网中看不到其他计算机怎么办
  20. CentOS7安装 jq

热门文章

  1. 通过最后更新物流分析多家快递的重点路向时限并导出表格
  2. 漫画|我见过的那些奇葩面试官......
  3. 阿里云服务器配置Java环境
  4. 电脑出问题了怎么重装系统修好
  5. C语言学习笔记(指针篇)
  6. 团队激励-马斯洛需求层次理论
  7. Linux-将yum源设置为阿里云的镜像源(Centos7/6/5)
  8. 對 RIME 輸入法粵拼詞庫的點點建議
  9. 随机森林算法(Random Forest)Python实现
  10. 苹果在iPhone用户死亡事件后进行了回收USB充电器