Spring AOP 与 Solon AOP 有什么区别?

Spring 和 Solon 作为容器型框架。都具有 IOC 和 AOP 的能力。其中:

  • Spring AOP 使用表达式确定“切入点”,可以是某个注解(有侵入),可以是包名或类名或方法(无侵入)
  • Solon AOP 只使用某个注解确定“切入点”(有侵入)

先看两个示例

1、Spring AOP 示例

Spring AOP 有很多不同的能力构建方式。此处采用更简洁的一种方式:

import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component;  @Aspect @Component public class LoggingAspect {     @Pointcut("execution(* com.example.demo.service.*.*(..))") //也可以是某注解表达式     public void serviceLayer() {}      @Around("serviceLayer()")     public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {         System.out.println("test");         return joinPoint.proceed();     } } 

应用示例

package com.example.demo.service;  @Component public class UserService {     public String getUserById(Long id) {         return "user-" + id;     }      public void updateUser(String user) {         System.out.println("update: " + user);     } } 

2、Solon AOP 示例

Solon AOP 有两种能力构建方式。此处采用更简洁的一种方式:

import org.noear.solon.annotation.Around; import org.noear.solon.core.aspect.Invocation; import org.noear.solon.core.aspect.MethodInterceptor;  @Around(Logging.LoggingInterceptor.class) //为注解,附加包围处理的能力 @Target({ElementType.TYPE,  ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface Logging {      class LoggingInterceptor implements MethodInterceptor {         @Override         public Object doIntercept(Invocation i) throws Throwable {             System.out.println("test");             return i.invoke();         }     } } 

应用示例

package com.example.demo.service;  @Logging @Component public class UserService {     public String getUserById(Long id) {         return "user-" + id;     }      public void updateUser(String user) {         System.out.println("update: " + user);     } } 

3、总结

体验感受 Spring AOP Solon AOP
有侵入体验 通过表达式描述,使用时添加“注解” 定义注解,使用时添加“注解”
无侵入体验 通过表达式描述包名或类名或方法,使用时无感 /
优点 可以完全“无侵入”实现 AOP 附加了什么能力比较透明
缺点 表达式有点难写;(可无限制添加)可能会有些混乱 (不能随意添加)可能会有局限性
发表评论

评论已关闭。

相关文章