Spring实现自定义注解

一, 背景

目前部门有一个培训,需要讲一下Spring的使用,看到有同学提出问题,想自定义实现一个打日志的注解,下面就记录一下实现过程。

环境:

Spring 6.1.5, 不使用Spring Boot.

二,实现步骤

1, 引入Spring和Spring AOP相关依赖

<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>

2,在springmvc-servlet.xml里添加配置(这里的springmvc-servlet.xml是在web.xml中指定的servlet标签里名称决定的)。

复制代码
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>

3,新建一个注解

java 复制代码
import java.lang.annotation.*;


@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyLog {
}

4,新增一个切面

java 复制代码
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class MyLogAspect {
    @Pointcut("@annotation(com.xxx.xxx.config.MyLog)")
    public void dsPointCut() {
    }

    @Before("dsPointCut()")
    public void doBefore() throws Throwable {
        System.out.println("我从before到注解的切点了");

    }

    @After("dsPointCut()")
    public void doAfter() {
        System.out.println("我从after退出了");
    }

    @Around("dsPointCut()")
    public Object doAround(ProceedingJoinPoint point) throws Throwable {
        System.out.println("我从around到注解的切点了");
        Object result = point.proceed();
        System.out.println("我从around退出了");
        return result;
    }
}

这里需要注意一点: point.proceed();表示程序继续运行, 然后拿到Object result, 一定要返回,不然被切面命中的方法会没有返回值, 也就是around这个处理要有返回值(因为它这个方法是自己定义,可以设置成void)。

5, 使用注解

java 复制代码
import com.xxx.xxx.config.MyLog;
import com.xxx.xxx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping(value="/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value="/list", method= RequestMethod.GET)
    @MyLog
    public String getUser(@RequestParam(value="name")  String name) {
        System.out.println(userService.getName());

        List<String> nameList = userService.getUserNames();
        nameList.stream().forEach(a -> System.out.println(a));
        return "hahaha";
    }


}

6, 运行项目,调用接口,可以看到打印出想要的日志

三,总结

具体原理网络上一大堆,但是没有看到有人用Spring去实现,其他人实现的基本上都是用了SpringBoot,没有参考意义。

希望对你有帮助!

相关推荐
罗政2 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端
架构文摘JGWZ2 小时前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师3 小时前
spring获取当前request
java·后端·spring
aPurpleBerry3 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏3 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko3 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985943 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程3 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统
m0_571957583 小时前
Java | Leetcode Java题解之第406题根据身高重建队列
java·leetcode·题解
程序猿小D4 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa