首页 > 其他分享 >简单实现Aop和注解配合使用

简单实现Aop和注解配合使用

时间:2024-01-10 15:55:05浏览次数:17  
标签:String org Aop 配合 annotation User import 注解 public

简单实现Aop和注解配合使用

添加依赖

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

创建注解

package com.dem.ceshiDemo.annotation;

import java.lang.annotation.*;

/**
 * @author lichangben
 * @date 2021/8/23
 */

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {
    String tag();
    String value() default "";

}

创建需要织入的代码
::: tip 提示
本次置入的代码效果是 将注解的value值放到User对象的用户名里
测试前提:注解放在方法上,且方法必须存在参数User在参数第一个位置
:::

package com.dem.ceshiDemo.aspect;

import com.dem.ceshiDemo.annotation.MyAnnotation;
import com.dem.ceshiDemo.bean.User;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.AnnotationUtils;
import org.springframework.stereotype.Component;

/**
 * @author lichangben
 * @date 2021/8/23
 */
@Aspect
@Component
public class MyAspect {

    //切入点
    @Pointcut("@annotation(com.dem.ceshiDemo.annotation.MyAnnotation)")
    public void MyPointCut(){
    }

    //在切入点之前触发
    @Before("MyPointCut()")
    public void doBefore(JoinPoint point) {
        MethodSignature signature = (MethodSignature) point.getSignature();
        //获取获取方法上的注解 注解所在方法:signature.getMethod()
        MyAnnotation annotation = AnnotationUtils.findAnnotation(signature.getMethod(), MyAnnotation.class);
        String value = annotation.value();
        String tag = annotation.tag();
        System.out.println(value);
        System.out.println(tag);
        //获取注解所在方法的参数
        User user = (User) point.getArgs()[0];
        user.setUsername(value);
    }

}

实体类(User)

package com.dem.ceshiDemo.bean;


/**
 * @author lichangben
 * @date 2021/8/23
 */
public class User {
    private String id;
    private String username;

    private String password;
    private int age;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    public String   getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

------开始测试------

Controller

package com.dem.ceshiDemo.controller;

import com.dem.ceshiDemo.bean.User;
import com.dem.ceshiDemo.service.CeshiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;


/**
 * @author lichangben
 * @date 2021/8
 */
@Controller
public class CompressController {

    @Autowired
    private CeshiService ceshiService;

    @GetMapping("/myAspect")
    @ResponseBody
    public User getUserName(){
        User user = new User();
        return ceshiService.getUser(user);
    }


}

service

package com.dem.ceshiDemo.service;

import com.dem.ceshiDemo.annotation.MyAnnotation;
import com.dem.ceshiDemo.bean.User;
import org.springframework.stereotype.Service;

/**
 * @author lichangben
 * @date 2021/8/23
 */
@Service
public class CeshiService {

    @MyAnnotation(value = "lcb",tag = "注解")
    public User getUser(User user){
        return user;
    }
}

结果

::: tip 提示
没有织入代码的话 username结果应该null
:::
结果

可以使用这个做日志

标签:String,org,Aop,配合,annotation,User,import,注解,public
From: https://www.cnblogs.com/lichangben/p/17956661

相关文章

  • 韩顺平java基础-11-枚举类与注解
    韩顺平java基础-11-枚举类与注解2024.1.5-2024.1.8枚举类定义概念定义常量对象,不能被修改语法1.自定义类实现枚举构造器私有化去掉set方法创建静态对象(new)优化:加入final修饰符,避免类加载2.enum关键字实现枚举关键字enum替换class创建对象:对象名+实参列表注......
  • 比较一下配置类加注解的方式和使用XML的区别
    使用注解和配置类的方式相较于XML方式,有以下几个优点:简化配置:通过使用注解和配置类,可以将SQL语句和映射配置直接写在Java代码中,避免了繁琐的XML配置。这样可以使配置更加简洁明了,减少了编写和维护配置文件的工作量。提高可读性:注解和配置类的方式将相关的配置信息直接与代码......
  • springboot通过自定义注解@Log实现日志打印
    springboot通过自定义注解@Log实现日志打印效果图实操步骤注意,本代码在springboot环境下运行,jdk1.81.引入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency>......
  • Java 基础 - 注解机制详解
    注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它是框架学习和设计者必须掌握的基础。注解基础注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。......
  • 反射、注解和反射的关系以及手写自己的注解。看完保证你能懂!
    1.一般我们会用反射来创建对象举个例子:先创建两个实体类Dog,Cat,然后再创建一个properties配置文件如下:bean=com.ref.Dog在后再通过反射来动态的创建这个两个实体类的对象:publicclassMyTest{privatestaticPropertiesproperties;static{try{p......
  • springMVC的常见注解,以及注解的作用。@Controller,@RestController,@RequestMapping,@
    目录注:使用注解,必须要开启注解包扫描1.@Controller2.@RequestMapping3.@PathVariable4.@RequestParam5.@RequestHeader6.@CookieValue7.@RequestBody该注解的作用8.@ResponseBody9.@RestController注:使用注解,必须要开启注解包扫描在MVC核心配置中开启注解包扫描<!--  配置包......
  • springmvc的五个常用注解?
    1、@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特......
  • Golang 协程配合管道
    请完成goroutine和channel协同工作的案例,具体要求:(1)开启一个writeData协程,向管道mtChan中写入50个整数.(2)开启一个readData协程,从管道intChan中读取writeData写入的数据。(3)注意:writeData和readDate操作的是同一个管道(4)主线程需要等待writeData和readDate协程都完成工作才能退出(如......
  • Java 自定义注解
    1. 元注解元注解是Java 提供的一些基本注解,使用这些元注解区可疑创建新的注解;可以先大致看一下元注解,然后去看后面自定义注解的例子。元注解有@Retention,@Documented,@Target,@Inherited,@Repeatable 五种。1.1 @Retention@Retention 可以定义注解的生命周期,注解的存活时......
  • Spring AOP快速上手
    什么是AOPAOP全称是aspect-orientedprograming面向切面编程。用于解决横向关注点的问题,横向关注点是指多个模块或者模块中的多个功能需要共享的功能,如日志记录、事务管理、安全控制等等。即重复性的代码抽象出来,形成可复用的代码模块。AOP的核心术语Joinpoint(连接点):程序执......