微人事第四天:springboot整合Aop

Aop是面向切面编程,在项目中有时我们希望通过打印日志来查错,Aop可以帮助我们实现。
创建springboot工程之后需要添加aop的相关依赖:

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

1.编写service类

package org.javaboy.aop.service;

import org.springframework.stereotype.Service;

@Service
public class UserService {

    public String getUsernameById(Integer id) {
        System.out.println("getUsernameById");
        return "javaboy";
    }

    public void deleteUserById(Integer id) {
        System.out.println("deleteUserById");
    }


}

这是一个service类,类中提供了两个方法。

2.controller类

package org.javaboy.aop;

import org.javaboy.aop.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/test1")
    public String getUsernameById(Integer id) {
        return userService.getUsernameById(id);
    }

    @GetMapping("/test2")
    public void deleteUserById(Integer id) {
        userService.deleteUserById(id);
    }
}

控制类中注入service类,在controller类中调用service类中的方法。

3.编写aop

package org.javaboy.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

//表示spring组件
@Component
//表示是切面
@Aspect
public class LogComponent {
    //定义拦截规则
    @Pointcut("execution(* org.javaboy.aop.service.*.*(..))")
    public void pc1() {

    }

    //前置通知
    @Before(value = "pc1()")
    public void before(JoinPoint jp) {
        //拿到执行方法名
        String name = jp.getSignature().getName();
        System.out.println("before--" + name);
    }

    //后置通知
    @After(value = "pc1()")
    public void after(JoinPoint jp) {
        String name = jp.getSignature().getName();
        System.out.println("after--" + name);
    }

    //返回通知
    @AfterReturning(value = "pc1()",returning = "result")
    public void afterReturning(JoinPoint jp,Object result) {
        String name = jp.getSignature().getName();
        System.out.println("afterReturning>>>>" + name + "------" + result);
    }

    //异常通知
    @AfterThrowing(value = "pc1()",throwing = "e")
    public void afterThrowing(JoinPoint jp,Exception e) {
        String name = jp.getSignature().getName();
        System.out.println("afterThrowing--" + name + "------" + e.getMessage());
    }


    //环绕通知(包含四个)
    @Around(value = "pc1()")
    public Object arround(ProceedingJoinPoint pjp) throws Throwable {
        return pjp.proceed();
    }
}

4.访问路径:http://localhost:8080/test1
控制台打印:

before--getUsernameById
getUsernameById
after--getUsernameById
afterReturning>>>>getUsernameById------javaboy
发布了287 篇原创文章 · 获赞 24 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41998938/article/details/104028875
今日推荐