SpringBoot 基于注解的 AOP

本贴最后更新于 2439 天前,其中的信息可能已经东海扬尘

google 搜索 spring aop annotation,看了一大堆,好多过时的内容,要么就特别复杂,再搜中文的 “spring 注解 代理”,看了半天也没啥帮助,今天试着试着突然搞定了,特别简单

springboot 用不着配置文件

定义注解

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

配置后置处理器

@Configuration public class AopConfig implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String s) throws BeansException { return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { //这个地方不添加过滤会导致 tomcat 启动失败,目前还没定位到确切原因 if (!bean.getClass().getName().startsWith("com.example.wsdemo")) { return bean; } ProxyFactory factory = new ProxyFactory(); factory.setTarget(bean); factory.addAdvisor(new MapCacheAdvice()); return factory.getProxy(); } }

MapCacheAdvice 源码

public class MapCacheAdvice extends DefaultPointcutAdvisor { @Override public Pointcut getPointcut() { return new AnnotationMatchingPointcut(null, MapCache.class); } @Override public Advice getAdvice() { return new MapCacheInterceptor(); } public static class MapCacheInterceptor implements MethodInterceptor, Advice { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println("==========================="); Object result = invocation.proceed(); System.out.println("---------------------------"); return result; } } }

测试

@Service public class SayService { @Autowired BBService bbService; public String say() { System.out.println("+++ say +++"); return bbService.getValue() + " hello"; } @MapCache public String say(String name) { System.out.println("+++ say hello +++"); return bbService.getValue() + " hello " \+ name; } }
@Controller public class IndexController { @ResponseBody @GetMapping("/test") public String say() { sayService.say("pk"); return sayService.say(); } }

调用结果

=========================== +++ say hello +++ --------------------------- +++ say +++
打赏 2 积分后可见
2 积分 • 1 打赏
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    945 引用 • 1460 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...