spring aop 注解
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 注解相关推荐
- Spring AOP注解方式实现
简介 上文已经提到了Spring AOP的概念以及简单的静态代理.动态代理简单示例,链接地址:https://www.cnblogs.com/chenzhaoren/p/9959596.html 本文 ...
- Spring AOP注解为什么失效?90%Java程序员不知道
转载自 Spring AOP注解为什么失效?90%Java程序员不知道 使用Spring Aop注解的时候,如@Transactional, @Cacheable等注解一般需要在类方法第一个入口的地方 ...
- java spring aop 注解包_Spring AOP 注解配置实例
Spring AOP注解例子 一:导入相关jar包. 首先导入Spring的相关包(这里就不多说了,我这里是3.2.4版本的) 然后导入AOP注解的相关包(不是spring的包)aspectjrt-1 ...
- spring AOP注解失效原因
目录 @Transactional @Async等注解不起作用 JDK动态代理 Spring AOP注解失效原因及解决 原因1:同一个类中,方法A调用方法B(方法B上加有注解),注解无效 原因2:AO ...
- spring AOP注解含义
spring AOP 的几个注解含义 @Aspect 指定一个类为切面类 @P ...
- spring AOP注解实现
一.什么是AOP 引用一下维基百科的定义 面向切面的程序设计(Aspect-oriented programming,AOP,又译作面向方面的程序设计.剖面导向程序设计)是计算机科学中的一种程序设计思 ...
- Spring AOP注解
1.配置 <!-- 配置spring创建容器时要扫描的包--><context:component-scan base-package="com">< ...
- spring注解:spring aop注解详解
一. AOP的基本概念 Aspect(切面):通常是一个类,里面可以定义切入点和通知 Pointcut(切点):就是带有通知的连接点,在程序中主要体现为书写切入点表达式 JointPoint(连接点) ...
- 初学spring aop 注解遇到的问题
初学spring,对spring注解这块了解不是很多,现在注解替代了xml配置文件,原来的bean id 去哪里了呢? //@Service//默认类名 @Service("rmb" ...
最新文章
- mysql repalication_MySQL主从复制的原理及配置方法(比较详细)
- 主题模型(topic models)总结
- java 取cpuid、主板id、硬盘id、mac地址
- 学习Kotlin(四)对象与泛型
- ORACLE的所有字段类型
- 停课不停学,优酷直播如何将网课点名延迟降到0.6s?
- python的变量的命名规则以及定义
- IE选项中的高级选项卡“启用内存保护帮助减少联机攻击”是灰色的,不能把前面的勾选取消掉
- mysql.proc_升级后直接更改mysql.proc表
- POI导出Excel2003
- 文档大小超出上传限制怎么办_一键PDF转Word、PPT、图片等文档,这才是办公族必备的效率神器!...
- 一个崭新的华为交换机配置
- java 定时任务 cron
- Charles 模拟慢网络
- linux去除快捷方式箭头,焦点去除Win8快捷方式箭头软件
- 机器学习-初级进阶(Thompson 抽样算法 )
- class_view_decorate
- 2014matlab精度设置,matlab设置数据精度
- 怎么发现不了同一网络的其他计算机,局域网中看不到其他计算机怎么办
- CentOS7安装 jq