Spring:使用Spring AOP时,如何获取目标方法上的注解

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

自定义注解

package com.agent.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import org.springframework.stereotype.Component;

@Component
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {

    public boolean isEnable() default true;
}

Spring AOP的AspectJ

package com.agent.aop;

import java.lang.reflect.Method;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import com.agent.annotation.MyAnnotation;

@Component
@Aspect
public class LogUtil {

    @Around("@annotation(com.agent.annotation.MyAnnotation)")
    public Object logWrited(ProceedingJoinPoint point) throws Throwable {

        Object[] args = point.getArgs();
        Class<?>[] argTypes = new Class[point.getArgs().length];
        for (int i = 0; i < args.length; i++) {
              argTypes[i] = args[i].getClass();
        }
        Method method = null;
        try {
            method = point.getTarget().getClass()
                    .getMethod(point.getSignature().getName(), argTypes);
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        }

        MyAnnotation ma = method.getAnnotation(MyAnnotation.class);
        System.out.println(ma.isEnable());

        return point.proceed();
    }

}

Service接口

package com.agent.service;

public interface UserService {

    void addUser(String name, String password);

}

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

package com.agent.service.impl;

import org.springframework.stereotype.Service;

import com.agent.annotation.MyAnnotation;
import com.agent.service.UserService;

@Service(value="userService")
public class UserServiceImpl implements UserService {

    @Override
    @MyAnnotation
    public void addUser(String name, String password) {
        System.out.println("UserServiceImpl.addUser()...... name: " + name + "; password: " + password);
    }

}

测试类:

package com.agent.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.agent.service.UserService;

public class AOPTest {

    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService us = (UserService)ac.getBean("userService");
        us.addUser("张三", "188");
    }

}

Spring的配置文件:

<?xml version="1.0" encoding="utf-8"?>

<beans  xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
                            http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context
                            http://www.springframework.org/schema/context/spring-context.xsd
                            http://www.springframework.org/schema/aop
                            http://www.springframework.org/schema/aop/spring-aop.xsd
                            http://www.springframework.org/schema/tx
                            http://www.springframework.org/schema/tx/spring-tx.xsd">

    <context:component-scan base-package="com.agent" />

<!--     <bean id="aspect" class="com.agent.aop.LogUtil" />
    <aop:config>
        <aop:aspect ref="aspect">
            <aop:pointcut expression="execution(* add*(..))" id="mypointcut"/>
            <aop:after method="logWrited" pointcut-ref="mypointcut"/>
            <aop:around method="logWrited" pointcut-ref="mypointcut" />
        </aop:aspect>
    </aop:config>
     -->
    <aop:aspectj-autoproxy/>
</beans>

测试结果:

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

        MethodSignature methodSignature = (MethodSignature)point.getSignature();
        Method method = methodSignature.getMethod();
时间: 2024-10-29 19:10:20

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

Spring中的AOP(五)——在Advice方法中获取目标方法的参数

摘要: 本文介绍使用Spring AOP编程中,在增强处理方法中获取目标方法的参数,定义切点表达式时使用args来快速获取目标方法的参数. 获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Ob

Spring中的AOP——在Advice方法中获取目标方法的参数(转)

获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返回AOP框架为目标对象生成的代理对象 注意:当使

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

系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 先看代码: @RequestMapping(value="manager") @Controller("managerController") public class ManagerController { /** * 后台用户登录 * @param request * @param em

【Spring四】AOP之XML配置

AOP:Aspect Oriented  Programming 面向切面编程 面向切面编程的核心是动态代理设计模式.请先參见动态代理设计模式笔记. 以Hibernate保存一个对象到数据库为例,因为保存数据时须要开启事务,利用面向切面编程思想,将事务的处理分离出来.当作一个切面来处理. jdk的动态代理的缺点: 1.在拦截器中,切入点的推断是很复杂的 2.尽管实现了切面与目标类的松耦合,可是在拦截器中还得实现结合过程 一.springAOP的原理: 目标类:在目标类的方法调用的前后,我们须要增

深入分析JavaWeb Item54 -- Spring中的AOP面向切面编程2

一.在Advice方法中获取目标方法的参数 1.获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPoint里包含了如下几个常用的方法: Object[] getArgs:返回目标方法的参数 Signature getSignature:返回目标方法的签名 Object getTarget:返回被织入增强处理的目标对象 Object getThis:返

spring中的AOP 以及各种通知

理解了前面动态代理对象的原理之后,其实还是有很多不足之处,因为如果在项目中有20多个类,每个类有100多个方法都需要判断是不是要开事务,那么方法调用那里会相当麻烦. spring中的AOP很好地解决了这个问题,通过 execution表达式 指定哪些包中的那些类 哪些方法 用到事务 execution(public * *(..))  所有的公共方法 execution(* set*(..))  以set开头的任意方法 execution(* com.xyz.service.AccountSer

Spring boot学习(六)Spring boot实现AOP记录操作日志

前言 在实际的项目中,特别是管理系统中,对于那些重要的操作我们通常都会记录操作日志.比如对数据库的CRUD操作,我们都会对每一次重要的操作进行记录,通常的做法是向数据库指定的日志表中插入一条记录.这里就产生了一个问题,难道要我们每次在 CRUD的时候都手动的插入日志记录吗?这肯定是不合适的,这样的操作无疑是加大了开发量,而且不易维护,所以实际项目中总是利用AOP(Aspect Oriented Programming)即面向切面编程这一技术来记录系统中的操作日志. 日志分类 这里我把日志按照面向

Spring框架及AOP

Spring核心概念 Spring框架大约由20个功能模块组成,这些模块主分为六个部分: Core Container :基础部分,提供了IoC特性. Data Access/Integration Web AOP(Aspect Orient Programming) Instrumentation Test Spring两大核心技术 控制反转(Inversion of Control IoC) 称之为”依赖注入”,是面向对象编程中的一个设计理念,用来降低程序代码之间的耦合度. 将组建对象的控制

Spring多个AOP执行先后顺序

Spring声明式事务是基于AOP实现的,那么,如果我们在同一个方法自定义多个AOP,我们如何指定他们的执行顺序呢?首先:配置AOP执行顺序的三种方式: 1.通过实现org.springframework.core.Ordered接口 [email protected]?? [email protected]?? [email protected]?? 4.public?class?MessageQueueAopAspect1?implements?Ordered{@Override?? 5.?