AOP编程

AOP编程

AOP,面向切面编程,一种编程范式,指导开发者如何组织程序结构。

OOP,面向对象编程,一种编程思想。

AOP,提供了一种机制,可以将一些横切系统中多个模块的共同逻辑(如日志记录、事务管理、安全控制等)从代码中分离出来,以提高模块的内聚性和可重用性。

AOP核心概念

  • 横切关注点:对哪些方法进行拦截,拦截后又如何处理,这些就是横切关注点。
  • 通知Advice:在特定的切入点上进行更强的处理。
  • 连接点JointPoint:程序执行过程中能应用切面的具体位置。
  • 切入点PointCut:定义在切面在哪些连接点上应用。
  • 切面Aspect:定义了切入点和通知,实现横切关注点的模块。

AOP切入点表达式

简单举个例子:

这个表达式包含以下匹配条件:

执行方法签名: 返回类型为任意类型(*)、方法名以"save"开头、参数类型为"com.example.entity.User

类或包匹配: 类名属于"com.example"包下的任意类

访问修饰符: public

AOP编程实践

        简单写一个用户服务模块的登录接口来实践AOP编程。

LoggingAspect 类:

  • 用 @Aspect 注解标记,表明这是一个切面类。
  • @Component 注解自动将这个类作为 Spring 管理的 Bean。
  • 定义了一个切点 handleMethod(),它匹配 com.example.service 包及其子包中所有以handle 开头的方法。

定义了三种通知:

  • @Before:在匹配的切点方法执行前执行。
  • @After:在匹配的切点方法执行后执行。
  • @Around:环绕匹配的切点方法执行,可以控制何时执行目标方法。

@Aspect
@Component
public class LoggingAspect {

    // 定义一个切点,匹配所有以"handle"开头的方法
    @Pointcut("execution(* com.example.service.*.handle*(..))")
    private void handleMethod() {}

    // 前置通知
    @Before("handleMethod()")
    public void beforeHandleMethod() {
        System.out.println("Before handling method");
    }

    // 后置通知
    @After("handleMethod()")
    public void afterHandleMethod() {
        System.out.println("After handling method");
    }

    // 环绕通知
    @Around("handleMethod()")
    public void aroundHandleMethod(ProceedingJoinPoint joinPoint) throws Throwable {
        System.out.println("Before method execution");
        joinPoint.proceed(); // 执行目标方法
        System.out.println("After method execution");
    }
}

AppConfig 类:

  • 使用 @Configuration 注解,表示这是一个 Spring 配置类。
  • @EnableAspectJAutoProxy 开启了对 AspectJ 的支持,允许使用 AOP。
  • @ComponentScan(“com.example”)指定了 Spring 进行组件扫描的包路径。
@Configuration
@EnableAspectJAutoProxy
@ComponentScan("com.example")
public class AppConfig {

}

Userservice 类:

  • 使用 @Service 注解标记,表明这是一个服务组件,并自动注册为 Spring 管理的 Bean。
  • handleLogin 方法是业务逻辑方法,它会被 AOP 切面所通知。
@Service
public class UserService {

    public void handleLogin(String username, String password) {
        // 登录逻辑
        System.out.println("UserService.handleLogin");
    }
}

Application 类:

  • 主入口,用于启动 Spring 应用上下文并执行业务逻辑。
public class Application {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        UserService userService =(UserService)context.getBean("userService");
        userService.handleLogin("admin", "123456");
    }
}

运行结果如下:

AOP编程的好处

  • 关注点分离:将业务逻辑与系统级服务(如日志记录、事务管理、安全性等)分离,使得代码更加清晰和模块化。
  • 提高代码复用性:横切关注点可以在多个地方复用,而无需在每个业务逻辑中重复编写。
  • 增强代码可维护性:当需要修改横切关注点时,只需在一个地方进行修改,而不必修改每个业务逻辑组件。
  • 减少代码重复:避免在多个类或方法中重复相同的代码,例如日志记录或事务处理。
  • 提高开发效率:开发者可以专注于业务逻辑的实现,而不必关心底层的横切关注点。
  • 动态行为织入:可以在不修改原始代码的情况下,动态地添加或修改方法的行为,提高软件的灵活性。
  • 更好的代码组织:通过切面和切点,可以更好地组织和管理代码,使得系统结构更加合理。
  • 易于扩展:新的横切关注点可以轻松地加入到现有系统中,而不影响现有业务逻辑。

总结:

        AOP编程以其独特的优势,在现代软件开发中扮演着至关重要的角色。它通过将横切关注点从业务逻辑中解耦,不仅提升了代码的整洁度和可维护性,还极大地增强了代码的可复用性和扩展性。随着企业应用的复杂性不断增加,AOP提供了一种优雅且高效的解决方案,使得开发者能够更加专注于解决业务问题,而不是被底层的通用问题所困扰。因此,AOP不仅是一种编程技术,更是一种提高软件开发质量和效率的策略。

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值