欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

01 SpringBoot AOP入门

程序员文章站 2022-07-12 15:37:47
...

开始使用

在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。

系统要求:

本文采用Java 1.8.0_102Spring Boot 1.5.9调试通过。

使用Maven构建项目

  1. 通过SPRING INITIALIZR工具产生基础项目
    1. 访问:http://start.spring.io/
    2. 选择构建工具Maven Project、Spring Boot版本1.5.9以及一些工程基本信息
      点击Generate Project下载项目压缩包
  2. 解压项目包,并用IDE以Maven项目导入,以IntelliJ IDEA 14为例:
    1. 菜单中选择File–>New–>Project from Existing Sources...
    2. 选择解压后的项目文件夹,点击OK
    3. 点击Import project from external model并选择Maven,点击Next到底为止。
    4. 若你的环境有多个版本的JDK,注意到选择Java SDK的时候请选择Java 7以上的版本

项目结构解析

通过上面步骤完成了基础项目的创建,Spring Boot的基础结构共三个文件(具体路径根据用户生成项目时填写的Group所有差异):

  • src/main/java下的程序入口:Application
  • src/main/resources下的配置文件:application.properties
  • src/test/下的测试入口:ApplicationTests

引入AOP模块

引入aop模块,需添加spring-boot-starter-aop模块:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
</dependencies>

编写Hello服务

  • 创建package命名为com.learn.service(根据实际情况修改)
  • 创建接口HelloService,内容如下
public interface HelloService {
    void sayHello();
}
  • 创建package命名为com.learn.service.impl(根据实际情况修改)
  • 创建实现类HelloServiceImpl,内容如下
@Service
public class HelloServiceImpl implements HelloService {

    @Override
    public void sayHello() {
        System.out.println("hello aop");
    }
}

编写单元测试用例

打开的src/test/下的测试入口ApplicationTests类。下面编写一个简单的单元测试,具体如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

    @Resource
    private HelloService helloService;

    @Test
    public void test() {
        helloService.sayHello();
    }
}

运行可以看到结果:

hello aop

使用aop

  • 创建package命名为com.learn.aop(根据实际情况修改)
  • 创建类HelloServiceAop,内容如下
@Aspect
@Component
public class HelloServiceAop {
    //匹配com.learn.service.impl包及其子包下的所有类的所有方法
    @Pointcut("execution(* com.learn.service.impl..*.*(..))")
    public void executeService(){

    }

    @Before("executeService()")
    public void doBeforeAdvice(JoinPoint joinPoint){
        System.out.println("我是前置通知!!!");
        //获取目标方法的参数信息
        Object[] obj = joinPoint.getArgs();
        System.out.println(obj);
        //AOP代理类的信息
        joinPoint.getThis();
        //代理的目标对象
        joinPoint.getTarget();
        //用的最多 通知的签名
        Signature signature = joinPoint.getSignature();
        //代理的是哪一个方法
        System.out.println(signature.getName());
        //AOP代理类的名字
        System.out.println(signature.getDeclaringTypeName());
        //AOP代理类的类(class)信息
        System.out.println(signature.getDeclaringType());
    }
}

运行之前的测试用例,可以看到输出已经变成了:

我是前置通知!!!
[Ljava.lang.Object;@997d532
sayHello
com.learn.service.HelloService
interface com.learn.service.HelloService
hello aop

可以看到在方法前面加上了一系列附加信息

当然,通过AOP不仅仅只能在方法前面加上一些额外处理,你还可以在方法后面,异常时等等进行一些额外的处理。
在后面的教程中将会详细说到这些。

目录
源码链接