首页 > 编程语言 >面向切面编程

面向切面编程

时间:2023-08-07 10:02:32浏览次数:32  
标签:编程 springframework 切面 import org com public 面向

本文,我们来谈谈面向切面编程。

什么是面向切面编程

面向切面编程(Aspect Oriented Program, 简称 AOP)是一种编程范式,用于解藕系统中的横切关注点。

这很抽象。

我们换种理解~

面向切面编程把业务功能分为核心、非核心两部分。比如:

  • 核心业务功能:用户登陆、增加数据、删除数据
  • 非核心业务功能:性能统计、日志、事务管理

Spring 的面向编程思想中,非核心业务功能被定义为切面。核心业务功能和切面功能(非核心功能)被分别进行独立开发,然后把切面功能和核心业务功能编织在一起,这就是 AOP

AOP 中的概念

术语

解析

切入点 pointcut

在哪些类、哪些方法上切入

通知 advice

在方法前、方法后、方法前后做了什么

切面 aspect

切面 = 切入点 + 通知

织入 weaving

把切面加入对象,并创建出代理对象的过程

环绕通知

AOP 中最强大、灵活的通知,它集成了前置和后置通知,保留了连接点原有的方法

案例图解

未使用 AOP

面向切面编程_后端

使用 AOP

面向切面编程_spring_02

简单案例

假设我们开发一个简单用户管理系统。

添加 aspect 依赖:

<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.19</version>
</dependency>

我们创建一个切面类,定义了我们要应用的横切关注点

package com.launch;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {
    @Before("execution(* com.launch.UserService.addUser(..))")
    public void logBeforeAddUser() {
        System.out.println("Before adding a user...");
    }

    @Before("execution(* com.launch.UserService.deleteUser(..))")
    public void logBeforeDeleteUser() {
        System.out.println("Before deleting a user...");
    }
}

我们创建了名为 LoggingAspect 的切面类,并使用 @Before 注释定义了两个通知方法。这两个通知分别在执行 com.example.UserService.addUser()com.example.UserService.deleteUser() 方法之前打印日志。

接下来,我们创建名为 UserService 类,并添加 @Service 注解:

package com.launch;

import org.springframework.stereotype.Service;

@Service
public class UserService {
    public void addUser(String username) {
        // add logic
        System.out.println("add logic " + username);
    }
    public void deleteUser(String username) {
        // remove logic
        System.out.println("delete logic " + username);
    }
}

然后我们在程序入口文件中添加 @EnableAspectJAutoProxy 注解,以启用 AOP

package com.launch;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@SpringBootApplication
@EnableAspectJAutoProxy
public class LaunchApplication {

    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(LaunchApplication.class);
        app.run(args);
    }

}

然后我们创建名为 JimmyController 的类进行测试:

package com.launch;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class JimmyController {
    @Autowired
    private UserService userService;

    @RequestMapping("/add_and_delete")
    public String addUser() {
        userService.addUser("Jimmy");
        userService.deleteUser("Jimmy");
        return "Add Jimmy.";
    }
}

这里我们触发 Get 请求 http://localhost:8080/add_and_delete 接口就可以看到下面的结果:

面向切面编程_spring_03

面向切面编程_spring_04

参考

  • 《Spring Boot 实战派》

标签:编程,springframework,切面,import,org,com,public,面向
From: https://blog.51cto.com/u_11966691/6991045

相关文章

  • C++核心编程——引用
    引用1引用的基本使用作用:给变量起别名语法:数据类型&别名=原名示例:intmain(){ inta=10; int&b=a; cout<<"a="<<a<<endl; cout<<"b="<<b<<endl; b=100; cout<<"a="&......
  • 第十七节 面向对象进阶(抽象类&接口&内部类)
    抽象类接口内部类教学目标能够写出抽象类的格式能够写出抽象方法的格式能说出抽象类的应用场景写出定义接口的格式写出实现接口的格式说出接口中成员的特点能说出接口的应用场景能说出接口中为什么会出现带有方法体的方法能完成适配器设计模式第一章抽......
  • 4 Linux网络编程
    4Linux网络编程4.1网络结构模式C/S结构:服务器/客户机,即Client-Server(C/S)结构。B/S结构:浏览器/服务器,即Browser/Server(B/S)结构4.2MAC地址、IP地址和端口4.2.1MAC地址MAC地址(MediaAccessControlAddress),在OSI模型中,第三层网络层负责IP地址,第二层数据链路层......
  • 面向对象设计原则
    单一职责原则(SingleResponsibilityPrinciple)单一职责原则(SingleResponsibilityPrinciple,SRP):一个类只负责一个功能领域中的相应职责,或者可以定义为:就一个类而言,应该只有一个引起它变化的原因。单一职责原则告诉我们:一个类不能太“累”!在软件系统中,一个类(大到模块,小到方......
  • 《Java编程思想第四版》学习笔记05
    6.9.1继承初始化我们有必要对整个初始化过程有所认识,其中包括继承,对这个过程中发生的事情有一个整体性的概念。请观察下述代码://:Beetle.java//Thefullprocessofinitialization.classInsect{inti=9;intj;Insect(){prt("i="+i+",j="+j);j=39;......
  • 【JAVA】探索泛型与数据结构:解锁高效编程
    引言在当今信息爆炸的时代,数据结构和算法成为了程序员必备的核心技能。而泛型作为Java语言中的一项强大特性,为数据结构和算法的实现提供了更高效、更安全的方式。本文将深入探讨泛型的概念、使用场景以及结合数据结构的应用,为您打开高效编程之道。第一部分:了解泛型1.1为什么使......
  • 9-3 BDC编程
    9-3BDC编程1基本:BATCHDATACOMMUNICATION-批量数据交互,是使用模拟用户操作的方法,批量录入数据的技术。有点类似于OFFICE软件中的宏。在BAPI出现之前,基本上使用非常广泛,现在有了BAPI,数据导入一般会选择BAPI。2两种模式:CTU使用CALLTRANSACTION(ABAP程序)BISESSION:使用批量......
  • Python类与面向对象
    目录一、面向对象的概念1.是什么?2.特点二、类与对象1.类的定义(1)类的定义格式(2)类的定义形式2.类的构造(创建create)方法3.类的实例化(类的对象化)(1)对象的创建格式(2)访问对象成员4.成员的定义及访问(1)私有变量和方法的访问——只允许本类使用,子类和外部都不能访问(2)公有变量和方法的访问......
  • c#面试编程题
    3个可乐瓶可以换⼀瓶可乐,现在有364瓶可乐,问⼀共可以喝多少瓶可乐,剩下⼏个空瓶。intpingNumber=364;intheNumber=364;while(pingNumber>2){heNumber+=pingNumber/3;pingNumber=(......
  • DOM编程
    DOM编程介绍DOM编程是指使用JavaScript与HTML文档中的DOM(文档对象模型)进行交互的过程。文档:整个HTML网页文档对象:网页中的每一部分都转换为了对象模型:使用模型表示对象之间的关系DOM是HTML文档的树状结构表示,它允许开发者使用JavaScript来访问、操作和修改HTML元素、......