-
提问题
-
AOP概念
-
AOP代码示例
-
源码分析
-
总结
到底什么是AOP
?Spring
框架到底在什么阶段进行数据织入的?AOP
在实际项目开发中到底有什么作用以及怎样将AOP
的编程思想运用到我们的实际项目开发中?
AOP(Aspect Orient Programming)
,我们通常称为面向切面编程。所谓切面是相对于面向对象来说的。面向对象是将实物抽象为对象,这是个纵向的概念。而面向切面是一个横向的概念,它更加关注那些散落在代码中公用的不涉及具体业务逻辑的通用处理方式,例如日志、权限验证以及统一异常处理等等。它是对于面向对象编程思想的一种结构化补充。核心思想就是将与业务逻辑无关的进行统一的框架织入,不对原有代码以及业务逻辑造成侵入。
Spring AOP
在运行时,能够动态地将代码切入到指定的类的指定方法、指定位置上的编程思想就是面向切面编程,这种切入的特点是不影响原来的业务逻辑。但是像AspectJ
可以在编译阶段以及类加载阶段进行织入。
一些概念的说明:
- 切面
所谓切面,按照自己的理解可以把它看作为一把刀,将他横切于其他物品,通过@Aspect
来将类定义一个切面,它就是切点与通知的结合,如下图所示。
- 切点
本质上来说,就是需要定义一个切入点表达式,使得可以在增强处理中使用到。通过切点定位和筛选特定的连接点。它关注通知需要织入的一个或者多个连接点,切入点包括两部分:
(1)切入点表达式:指定切入点与哪些方法进行匹配;
(2)切入点名称:方法签名
- 连接点
连接点是一个相对虚拟的概念,可以将它理解为切点的集合,也就是Spring
允许我们进行通知操作的地方,比如方法、异常抛出的地方,如果使用aspectj
则也支持在构造器中或者属性中允许通知。
- 通知
通俗地说,通知就是我们需要实现的功能,可以分为前置、后置、异常、最终以及环绕通知这五类。例如日志,权限等业务逻辑。
-
前置通知:在目标方法或者连接点被调用前执行通知操作;
-
后置通知:在某些连接点执行完成之后进行通知操作;
-
异常通知:在方法抛出异常退出当前时进行通知操作;
-
最终通知:当切入点退出时无论是方法正常执行结束还是异常抛出后退出执行的通知操作;
-
环绕通知:包围一个切点的通知,如方法调用。这是最强大的一种通知类型。环绕通知可以在方法调用前后完成自定义的行为。它也会选择是否继续执行连接点或直接返回它自己的返回值或抛出异常来结束执行。
1.定义一个普通业务逻辑方法
@Component(“userDao”)
public class UserDao {
/**
-
@Description: 查询
-
@Return
-
@Author taomeng
-
@Version V1.0.0
-
@CreateDate: 2018/9/23 11:31
*/
public void query() {
System.out.println(“query user data!!!”);
}
}
2.定义一个切面类,同时在这个切面类中将切点等进行定义。
/**
-
@Auther: taomeng
-
@Date: 2018/9/17 23:32
-
@Description: 定义切面类
*/
@Configuration
@Aspect
@ComponentScan(basePackages = {“com.tm.springrun.module”})
@ImportResource(locations = {“classpath:spring-context.xml”})
public class AopConfig {
/**
-
@Description:定义切点
-
@Return
-
@Author taomeng
-
@Version V1.0.0
-
@CreateDate: 2018/9/23 11:32
*/
@Pointcut(“execution(* com.tm.springrun.module.dao.UserDao.query())”)
public void declareJointPointExpression(){}
@Before(“declareJointPointExpression()”)
public void beforeMethod(JoinPoint joinPoint) {
String method = joinPoint.getSignature().getName();
System.out.println(“The method of before:” + method);
}
@After(“declareJointPointExpression()”)
public void afterMethod(JoinPoint joinPoint) {
String method = joinPoint.getSignature().getName();
System.out.println(“The method of after:” + method );
}
}
3.在Spring Context
中获取Bean
的实例,同时执行Bean
实例的方法。
/**
-
@Auther: taomeng
-
@Date: 2018/9/17 23:37
-
@Description: 测试AOP
*/
public class Test {
public static void main(String[] args) {
//1.加载spring环境
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(AopConfig.class);
//2.获取spring context中的bean的实例
UserDao userDao = (UserDao)annotationConfigApplicationContext.getBean(“userDao”);
//3.执行bean中的方法
userDao.query();
}
}
同时需要在配置文件中开启AOP,如下所示:
aop:aspectj-autoproxy/
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://i-blog.csdnimg.cn/blog_migrate/dfcdeb0110b5a94e79b7d3e13635c269.jpeg)
《MySql面试专题》
《MySql性能优化的21个最佳实践》
《MySQL高级知识笔记》
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
关注我,点赞本文给更多有需要的人
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
片转存中…(img-mtK2y40Z-1713424596708)]
文中展示的资料包括:**《MySql思维导图》《MySql核心笔记》《MySql调优笔记》《MySql面试专题》《MySql性能优化的21个最佳实践》《MySq高级知识笔记》**如下图
[外链图片转存中…(img-5JWV2NTg-1713424596708)]
关注我,点赞本文给更多有需要的人
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!