Spring AOP应用场景你还不知道?这篇一定要看!

简介: Spring AOP应用场景你还不知道?

回顾一下Spring AOP的知识

为什么会有面向切面编程(AOP)?
我们知道Java是一个面向对象(OOP)的语言,但它有一些弊端,比如当我们需要为多个不具有继承关系的对象引入一个公共行为,例如日志、权限验证、事务等功能时,只能在在每个对象里引用公共行为。这样做不便于维护,而且有大量重复代码。AOP的出现弥补了OOP的这点不足。
Spring AOP 中设计的一些核心知识,面试问题?
1、能说一下Spring AOP用的是哪种设计模式?
回答:代理模式。

2、 能简单聊一下你对代理模式的理解吗?
代理模式 balabala......,记住一些贴近日常的示例方便理解,如买火车票,Windows 里面的快捷方式...

3、 知道JDK代理和Cglib代理有什么区别?
我们不需要创建代理类,JDK 在运行时为我们动态的来创建,JDK代理是接口 balabala
若目标类不存在接口,则使用Cglib生成代理,balabala
不管是JDK代理还是Cglib代理本质上都是对字节码进行操作,balabala

4、让你实现一个JDK实现动态代理?你的思路是什么?
照葫芦画瓢,照猫画虎。
Proxy: 定义一个自己的Proxy类
InvocationHandler:定义一个自己的InvocationHandler类
ClassLoad:自定义类加载器(方便加载我们自己指定的路径下面的类)

上面简单回顾,并抛出一些问题。带着问题阅读,效果杠杠的。
image

回到本文的重点

SpringAOP的在实际应用中场景有哪些?

Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging,tracing,profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
Logging 日志

以日志为例

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,比如
image

但大多数的日子处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。
image

但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。
通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置
插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。
image

为了在指定位置执行这些横向的功能,需要知道指定的是什么地方。
image

例如上图,方法级别的aop实现,在一个程序执行链条中,把method2称为切点,也就是说在method2执行时会执行横切的功能,那么是在method2之前还是之后呢,又是执行什么呢?这些都由advice(通知)来指定。advice有5种类型,分别是:
Before(前置通知) 目标方法调用之前执行
After(后置通知) 目标方法调用之后执行
After-returning(返回通知) 目标方法执行成功后执行
After-throwing(异常通知) 目标方法抛出异常后执行
Around(环绕通知) 相当于合并了前置和后置
把切点和通知合在一起就是切面了,一个切面指定了在何时何地执行何种方法。在spring aop中如此定义这个切面:

@Aspect
@Component
public class HelloAspect {

  @Before("execution(* com.test.service.impl.HelloServiceImpl.sayHello(..))")
  public void sayHello(){
    System.out.println("hello Java编程技术乐园!");
  }

}

使用注解@Aspect将某个特定的类声明为切面,这样,该类下的方法就可以声明为横向的功能点后插入到指定位置。使用execution表达式声明在这个切点,格式如下:
image

第一个位置指定了方法的返回值,*号代表任意类型的返回值,然后是所在的类和方法名,星号同样代表任意,就是该类中任意的方法,在上一个例子中方法名是sayHello,则是指定了该类中的sayHello方法。然后最后一个参数是方法入参,因为Java中支持重载,所以这个参数可以帮助你更精确的进行定位。两点表示任意参数类型。这样,execution表达式告诉了程序该在何地执行通知。而被诸如@Before注解修饰的方法就是通知的内容,也就是做什么。

总结

我们使用spring aop,有两点需要注意:
1、将切面类声明为一个bean
2、切点指定的方法所在的类也同样需由spring注入才能生效
欢迎大家关注我的公种浩【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。

最后

欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
1月前
|
监控 Java 开发者
Spring AOP动态代理
Spring AOP动态代理
43 1
|
1月前
|
传感器 Java API
Spring揭秘:Aware接口应用场景及实现原理!
Aware接口赋予了Bean更多自感知的能力,通过实现不同的Aware接口,Bean可以轻松地获取到Spring容器中的其他资源引用,像ApplicationContext、BeanFactory等。 这样不仅增强了Bean的功能,还提高了代码的可维护性和扩展性,从而让Spring的IoC容器变得更加强大和灵活。
127 0
Spring揭秘:Aware接口应用场景及实现原理!
|
1月前
|
Java Spring 容器
Spring的AOP失效场景详解
Spring的AOP失效场景详解
108 0
|
29天前
|
设计模式 Java Maven
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
Spring Aop 底层责任链思路实现-springaopdi-ceng-ze-ren-lian-si-lu-shi-xian
34 1
|
2月前
|
XML Java 数据格式
5个点轻松搞定Spring AOP底层实现原理
AOP 也是 Spring 中一个较为重要的内容,相对于传统的 OOP 模式,AOP 有很多让人难以理解的地方,本篇文章将向大家介绍 AOP 的实现方法及其底层实现,内容包括:
46 1
|
22天前
|
XML Java Maven
Spring之Aop的注解使用
Spring之Aop的注解使用
|
28天前
|
Java Spring
Spring 如何实现 AOP
Spring 如何实现 AOP
17 0
|
1月前
|
Java 编译器 程序员
Spring AOP 和 AspectJ 的比较
Spring AOP 和 AspectJ 的比较
37 0
|
1月前
|
Java Spring
【spring(三)】AOP总结
【spring(三)】AOP总结
|
1月前
|
存储 Java 数据处理
Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!
ClassPathScanningCandidateComponentProvider是Spring框架中一个非常核心的类,它主要用于在类路径下扫描并发现带有特定注解的组件,支持诸如@ComponentScan、@Component、@Service、@Repository和@Controller等注解的自动扫描和注册。
Spring揭秘:ClassPathScanningProvider接口应用场景及实现原理!