当使用spring AOP时,判断目标方法上的注解进行相关操作,如缓存,认证权限等

自定义注解

  1. package com.agent.annotation;
  2.  
  3. import java.lang.annotation.ElementType;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7.  
  8. import org.springframework.stereotype.Component;
  9.  
  10. @Component
  11. @Retention(RetentionPolicy.RUNTIME)
  12. @Target(ElementType.METHOD)
  13. public @interface MyAnnotation {
  14.  
  15. public boolean isEnable() default true;
  16. }

Spring AOP的AspectJ

  1. package com.agent.aop;
  2.  
  3. import java.lang.reflect.Method;
  4.  
  5. import org.aspectj.lang.ProceedingJoinPoint;
  6. import org.aspectj.lang.annotation.Around;
  7. import org.aspectj.lang.annotation.Aspect;
  8. import org.springframework.stereotype.Component;
  9.  
  10. import com.agent.annotation.MyAnnotation;
  11.  
  12. @Component
  13. @Aspect
  14. public class LogUtil {
  15.  
  16. @Around("@annotation(com.agent.annotation.MyAnnotation)")
  17. public Object logWrited(ProceedingJoinPoint point) throws Throwable {
  18.  
  19. Object[] args = point.getArgs();
  20. Class<?>[] argTypes = new Class[point.getArgs().length];
  21. for (int i = 0; i < args.length; i++) {
  22. argTypes[i] = args[i].getClass();
  23. }
  24. Method method = null;
  25. try {
  26. method = point.getTarget().getClass()
  27. .getMethod(point.getSignature().getName(), argTypes);
  28. } catch (NoSuchMethodException e) {
  29. e.printStackTrace();
  30. } catch (SecurityException e) {
  31. e.printStackTrace();
  32. }
  33.  
  34. MyAnnotation ma = method.getAnnotation(MyAnnotation.class);
  35. System.out.println(ma.isEnable());
  36.  
  37. return point.proceed();
  38. }
  39.  
  40. }

Service接口

  1. package com.agent.service;
  2.  
  3. public interface UserService {
  4.  
  5. void addUser(String name, String password);
  6.  
  7. }

service接口的实现类,被自定义注解所注解

  1. package com.agent.service.impl;
  2.  
  3. import org.springframework.stereotype.Service;
  4.  
  5. import com.agent.annotation.MyAnnotation;
  6. import com.agent.service.UserService;
  7.  
  8. @Service(value="userService")
  9. public class UserServiceImpl implements UserService {
  10.  
  11. @Override
  12. @MyAnnotation
  13. public void addUser(String name, String password) {
  14. System.out.println("UserServiceImpl.addUser()...... name: " + name + "; password: " + password);
  15. }
  16.  
  17. }

测试类:

  1. package com.agent.test;
  2.  
  3. import org.springframework.context.ApplicationContext;
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;
  5.  
  6. import com.agent.service.UserService;
  7.  
  8. public class AOPTest {
  9.  
  10. public static void main(String[] args) {
  11.  
  12. ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
  13. UserService us = (UserService)ac.getBean("userService");
  14. us.addUser("张三", "188");
  15. }
  16.  
  17. }

Spring的配置文件:

  1. <?xml version="1.0" encoding="utf-8"?>
  2.  
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xsi:schemaLocation="http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans.xsd
  10. http://www.springframework.org/schema/context
  11. http://www.springframework.org/schema/context/spring-context.xsd
  12. http://www.springframework.org/schema/aop
  13. http://www.springframework.org/schema/aop/spring-aop.xsd
  14. http://www.springframework.org/schema/tx
  15. http://www.springframework.org/schema/tx/spring-tx.xsd">
  16.  
  17. <context:component-scan base-package="com.agent" />
  18.  
  19. <!-- <bean id="aspect" class="com.agent.aop.LogUtil" />
  20. <aop:config>
  21. <aop:aspect ref="aspect">
  22. <aop:pointcut expression="execution(* add*(..))" id="mypointcut"/>
  23. <aop:after method="logWrited" pointcut-ref="mypointcut"/>
  24. <aop:around method="logWrited" pointcut-ref="mypointcut" />
  25. </aop:aspect>
  26. </aop:config>
  27. -->
  28. <aop:aspectj-autoproxy/>
  29. </beans>

测试结果:

如果使用的是接口的模式,而注解在实现类上,则不能使用如下方式获取目标方法的对象,因为该方式获取的是该类的接口或者顶级父类的方法的对象

  1. MethodSignature methodSignature = (MethodSignature)point.getSignature();
  2. Method method = methodSignature.getMethod();

Spring:使用Spring AOP时,如何获取目标方法上的注解的更多相关文章

  1. AOP中ProceedingJoinPoint获取目标方法,参数,注解

    private void saveLog(ProceedingJoinPoint jp,long time)throws Throwable { package com.cy.pj.common.as ...

  2. 学习spring第6天(aop获取目标方法参数)

    关于<aop:around>中的方法,需要第一个参数为ProceedJoinPoint,在方法体中通过该参数调用proceed()才能使目标方法得到调用. 当一个切面中有多个<aop ...

  3. spring aop获取目标对象的方法对象(包括方法上的注解)

    这两天在学习权限控制模块.以前看过传智播客黎活明老师的巴巴运动网视频教程,里面就讲到权限控制的解决方案,当时也只是看看视频,没有动手实践,虽说看过几遍,可是对于系统中的权限控制还是很迷茫,所以借着这次 ...

  4. thinkphp5 查询的数据是对象时,获取原始数据方法

    获取原始数据 如果你定义了获取器的情况下,希望获取数据表中的原始数据,可以使用: $user = User::get(1); // 通过获取器获取字段 echo $user->status; / ...

  5. SpringMVC + Spring + MyBatis 学习笔记:在类和方法上都使用RequestMapping如何访问

    系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @Requ ...

  6. 黑马-Spring(IOC&DI) AOP

    IOC(控制翻转) 概念 把对象的创建.初始化.销毁等工作交给spring容器来做 案例 环境 步骤 1.  写一个HelloWorld类 2.  写一个配置文件   把hello类放到spring容 ...

  7. spring5 源码深度解析----- 创建AOP代理之获取增强器

    在上一篇的博文中我们讲解了通过自定义配置完成了对AnnotationAwareAspectJAutoProxyCreator类型的自动注册,那么这个类到底做了什么工作来完成AOP的操作呢?首先我们看看 ...

  8. Spring学习之Aop的各种增强方法

    AspectJ允许使用注解用于定义切面.切入点和增强处理,而Spring框架则可以识别并根据这些注解来生成AOP代理.Spring只是使用了和AspectJ 5一样的注解,但并没有使用AspectJ的 ...

  9. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

随机推荐

  1. mysql,apache,php的关系

    首先要明白动态网站与静态网站 所谓的动态网页,是指跟静态网页相对的一种网页编程技术.静态网页,随着html代码的生成,页面的内容和显示效果就基本上不会发生变化了——除非你修改页面代码.而动态网页则不然 ...

  2. Thinkcmf截取内容长度

    例1: {$vo.post_title|msubstr=0,10} 截取标题,msubstr=0,10,数字表示截取的字符串长度,显示省略号,但无论长度是否超过截取的长度都会出现省略号: 例2: {$ ...

  3. codeforces 596

    C 题意 定义p-binary为2^x+p 现在给你一个数x,和一个p. 问你最少用多少个p-binary能构造出x,如果没有输出-1 题解 转化为: x = 2^x1 + 2^x2 + ... + ...

  4. storm 机制

    storm基础系列之二----zookeeper的作用 https://www.cnblogs.com/xyang/p/5643745.html Zookeeper+Storm集群搭建 https:/ ...

  5. TensorFlow中的Session、Graph、operation、tensor

    TensorFlow中的Session.Graph.operation.tensor

  6. IDEA中使用Lombok时候,getter,setter注解不生效/每次重启后才生效

    Relevance.java代码如下: import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; imp ...

  7. python模块——datetime

    datetime模块是python自带对时间的操作,其常用的四大类分别是date.time.datetime.timedelta.下面分别讲解下这四大类中常用的方法及其属性. date类 date类的 ...

  8. 《C程序设计(第四版)》小记

    我看的这本书很经典,它是谭浩强写的,也就是广为流传的“C语言红皮书”.在网上看了很多帖子,生活中也问过一些朋友,大多数人是不认可这本书的.很多人都说这本书很烂,看不懂,然后去“追逐”国外的一些教材.其 ...

  9. Linux设置环境变量PATH路径的两种方法

    echo 'export dataPath=$HOME/data/pre' >> ~/.bash_profile 路径即刻生效: . .bash_profile 或 source .bas ...

  10. [Algo] 306. Check If Linked List Is Palindrome

    Given a linked list, check whether it is a palindrome. Examples: Input:   1 -> 2 -> 3 -> 2 ...