🎊专栏【Spring】
🍔喜欢的诗句:天行健,君子以自强不息。
🎆音乐分享【如愿】
🎄欢迎并且感谢大家指出小吉的问题🥰
文章目录
AOP(面向切面编程)是Spring框架中的重要组成部分。它允许在不修改原代码的情况下为程序动态地添加新的功能。如果你也想提高Spring应用的可扩展性,本文将带你深入学习Spring AOP的核心概念。
我们将讲解AOP的作用、实现方式和关键组成部分,包括切面、通知、切入点等。并使用注解的方式实现一个简单的切面示例,让你快速了解AOP的基本用法。学完本文你将能够在Spring项目中应用AOP思想,解耦业务代码,轻松实现新的功能需求。让我们开始AOP之旅!
🌺AOP简介
AOP(Aspect-Oriented Programming)是
面向切面编程的一种编程范式,指导开发者如何组织程序结构
。它提供了一种将横切关注点(例如日志记录、性能统计、安全检查等)与业务逻辑分离的方法。
在传统的面向对象编程中,业务逻辑通常分散在多个对象或方法中。而使用AOP,我们可以通过定义切面(Aspect)来将这些横切关注点集中起来,并将其应用到多个对象或方法上。
切面是一个跨越多个类和方法的模块化单元,它定义了横切关注点和相应的行为。在程序运行时,AOP框架会根据切面的定义,动态地将其织入到目标对象或方法中,从而实现横切关注点的功能增强。
🌺AOP作用
在不影响原始设计的基础上进行功能增强
(
原代码不用改,功能就变强了
)
🌺AOP核心概念
切面描述的是 通知的共性功能 与 对应的 切入点 的关系,在 哪个切入点 上 执行哪些通知
🎄AOP入门案例
项目结构
在pom.xml文件中导入依赖
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.10.RELEASE</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.3</version></dependency></dependencies>
🛸报错解决
这里可能会报错
🏳️🌈方法一
切换版本号
🏳️🌈方法二
这个问题困扰了我很长时间,如何看报错,是无法访问maven的中心仓库,就考虑是maven镜像没有使用上
然后打开设置,发现果然是这个问题
切换为下面的配置,问题就解决了
创建BookDaoimpl类
packagecom.example.dao.impl;importcom.example.dao.BookDao;importorg.springframework.stereotype.Repository;@RepositorypublicclassBookDaoimplimplementsBookDao{publicvoidsave(){System.out.println(System.currentTimeMillis());System.out.println("book dao save ...");}publicvoidupdate(){System.out.println("book dao update ...");}}
创建BookDao接口
packagecom.example.dao;publicinterfaceBookDao{publicvoidupdate();voidsave();}
创建MyAdvice类
在里面写入共性功能
publicvoidmethod(){System.out.println(System.currentTimeMillis());}
在里面写入切入点
privatevoidpt(){}
MyAdvice.java
packagecom.example.aop;importorg.aspectj.lang.annotation.Aspect;importorg.aspectj.lang.annotation.Before;importorg.aspectj.lang.annotation.Pointcut;importorg.springframework.stereotype.Component;@Component//读到是一个bean@Aspect//告诉你去识别下面的内容publicclassMyAdvice{// 切入点(“执行(方法)”)@Pointcut("execution(void com.example.dao.BookDao.update())")//定义切入点privatevoidpt(){}//定义切入点@Before("pt()")//绑定切入点和通知publicvoidmethod(){System.out.println(System.currentTimeMillis());}//定义通知}
创建SpringConfig类
packagecom.example.config;importorg.springframework.context.annotation.ComponentScan;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration@ComponentScan("com.example")@EnableAspectJAutoProxy//告诉程序我们要使用注解开发aop 去识别MyAdvice里面的 @AspectpublicclassSpringConfig{}
创建App类
packagecom.example;importcom.example.config.SpringConfig;importcom.example.dao.BookDao;importorg.springframework.context.ApplicationContext;importorg.springframework.context.annotation.AnnotationConfigApplicationContext;publicclassApp{publicstaticvoidmain(String[] args){ApplicationContext ctx=newAnnotationConfigApplicationContext(SpringConfig.class);BookDao bookDao=ctx.getBean(BookDao.class);
bookDao.save();}}
🎈结果
🌺AOP切入点表达式
- 切入点:要进行增强的方法
- 切入点表达式:要进行增强的方法的描述方式
⭐使用通配符加速配置
我们修改一下MyAdvice的代码,使用通配符表达式来写
⭐书写技巧
🎍AOP通知类型
AOP为我们提供了一种实现横向功能的clean方法,可以减少代码重复,降低模块间耦合。但它的使用需要我们思考非函数性需求的抽象与封装。在接下来的Spring学习中,我们还会看到AOP在事务管理等方面的典型应用。
本文只是AOP入门,实际应用中我们还需要学习更多知识,如AspectJ的使用、AOP性能优化等。如果你有任何疑问或想法,欢迎在评论区与我互动。让我们携手学习AOP,Build更优秀的Spring应用程序!
版权归原作者 在下小吉. 所有, 如有侵权,请联系我们删除。