Spring AOP 自定义注解的实现代码

1.在Maven中加入以下以依赖:

<!-- Spring AOP + AspectJ by shipengzhi -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aop</artifactId>
      <version>3.0.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>3.0.6.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.6.11</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.6.11</version>
    </dependency>
    <dependency>
      <groupId>cglib</groupId>
      <artifactId>cglib</artifactId>
      <version>2.1_3</version>
    </dependency>
    <!-- end -->

在spring-***.xml中加入spring支持,打开aop功能

头文件声明 :

xmlns:aop="http://www.springframework.org/schema/aop"
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  <!-- 自定义AOP -->
  <aop:aspectj-autoproxy proxy-target-class="true">
    <aop:include name="controllerAspect" />
  </aop:aspectj-autoproxy>
  <bean id="controllerAspect" class="com.sogou.upd.passport.common.aspect.ControllerAspect"></bean> 

  //或:
  <aop:aspectj-autoproxy> 

编写自定义注解。实现对方法所实现的功能进行描述,以便在通知中获取描述信息

/*
 * 校验签名合法性 自定义事务
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface SecureValid {
  String desc() default "身份和安全验证开始...";
}

@Target 用于描述注解的使用范围(即:被描述的注解可以用在什么地方),其取值有:


取值


描述


CONSTRUCTOR


用于描述构造器。


FIELD


用于描述域。


LOCAL_VARIABLE


用于描述局部变量。


METHOD


用于描述方法。


PACKAGE


用于描述包。


PARAMETER


用于描述参数。


TYPE


用于描述类或接口(甚至 enum )。

@Retention 用于描述注解的生命周期(即:被描述的注解在什么范围内有效),其取值有: 


取值


描述


SOURCE


在源文件中有效(即源文件保留)。


CLASS


在 class 文件中有效(即 class 保留)。


RUNTIME


在运行时有效(即运行时保留)。

@Documented 在默认的情况下javadoc命令不会将我们的annotation生成再doc中去的,所以使用该标记就是告诉jdk让它也将annotation生成到doc中去

  @Inherited 比如有一个类A,在他上面有一个标记annotation,那么A的子类B是否不用再次标记annotation就可以继承得到呢,答案是肯定的

  Annotation属性值 有以下三种: 基本类型、数组类型、枚举类型

1:基本串类型

public @interface UserdefinedAnnotation {
  intvalue();
  String name();
  String address();
}

使用:

@UserdefinedAnnotation(value=123,name="wangwenjun",address="火星")
  public static void main(String[] args) {
    System.out.println("hello");
  }
}

如果一个annotation中只有一个属性名字叫value,我没在使用的时候可以给出属性名也可以省略。

public @interface UserdefinedAnnotation {
  int value();
}

也可以写成如下的形式

@UserdefinedAnnotation(123) 等同于@UserdefinedAnnotation(value=123)
  public static void main(String[] args) {
    System.out.println("hello");
} 

2:数组类型 我们在自定义annotation中定义一个数组类型的属性,代码如下:

public @interface UserdefinedAnnotation {
  int[] value();
} 

使用:

public class UseAnnotation { 

  @UserdefinedAnnotation({123})
  public static void main(String[] args) {
    System.out.println("hello");
  }
}

注意1:其中123外面的大括号是可以被省略的,因为只有一个元素,如果里面有一个以上的元素的话,花括号是不能被省略的哦。比如{123,234}。

注意2:其中属性名value我们在使用的时候进行了省略,那是因为他叫value,如果是其他名字我们就不可以进行省略了必须是@UserdefinedAnnotation(属性名={123,234})这样的格式。

3:枚举类型

public enum DateEnum {
  Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday
} 

然后在定义一个annotation

package com.wangwenjun.annatation.userdefined; 

public @interface UserdefinedAnnotation {
  DateEnum week();
} 

使用:

public class UseAnnotation {
  @UserdefinedAnnotation(week=DateEnum.Sunday)
  public static void main(String[] args) {
    System.out.println("hello");
  }
} 

4:默认值

public @interface UserdefinedAnnotation {
  String name() default "zhangsan";
}

使用:

public class UseAnnotation {
  @UserdefinedAnnotation()
  public static void main(String[] args) {
    System.out.println("hello");
  }
} 

5:注意

Annotation是不可以继承其他接口的,这一点是需要进行注意,这也是annotation的一个规定吧。

Annotation也是存在包结构的,在使用的时候直接进行导入即可。

Annotation类型的类型只支持原声数据类型,枚举类型和Class类型的一维数组,其他的类型或者用户自定义的类都是不可以作为annotation的类型,我查看过文档并且进行过测试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 深入理解spring的AOP机制原理

    前言 在软件开发中,散布于应用中多处的功能被称为横切关注点,通常来讲,这些横切关注点从概念上是与应用的业务逻辑相分离的.把这些横切关注点和业务逻辑分离出来正是AOP要解决的问题.AOP能够帮我们模块化横切关注点,换言之,横切关注点可以被描述为影响应用多出的功能.这些横切点被模块化特殊的类,这些类被称为切面. 术语定义 通知:切面有必须要完成的工作,在AOP中,切面的工作被称为通知.通知定义了切面是什么以及何时使用,除了描述切面要完成的工作,通知还解决了何时执行这个工作的问题,它应该在某个方法之前

  • Spring AOP 基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • 关于spring中aop的注解实现方法实例详解

    前言 在之前的一篇文章中我们讲到spring的xml实现,这里我们讲讲使用注解如何实现aop呢.前面已经讲过aop的简单理解了,这里就不在赘述了.话不多说,来一起看看详细的介绍: 注解方式实现aop我们主要分为如下几个步骤: 1.在切面类(为切点服务的类)前用@Aspect注释修饰,声明为一个切面类. 2.用@Pointcut注释声明一个切点,目的是为了告诉切面,谁是它的服务对象.(此注释修饰的方法的方法体为空,不需要写功能比如 public void say(){};就可以了,方法名可以被候命

  • Spring AOP 动态多数据源的实例详解

     Spring AOP 动态多数据源的实例详解 当项目中使用到读写分离的时候,我们就会遇到多数据源的问题.多数据源让人最头痛的,不是配置多个数据源,而是如何能灵活动态的切换数据源.例如在一个spring和Mybatis的框架的项目中,我们在spring配置中往往是配置一个dataSource来连接数据库,然后绑定给sessionFactory,在dao层代码中再指定sessionFactory来进行数据库操作. 正如上图所示,每一块都是指定绑死的,如果是多个数据源,也只能是下图中那种方式. 可看

  • 基于spring中的aop简单实例讲解

    aop,即面向切面编程,面向切面编程的目标就是分离关注点,比如:一个骑士只需要关注守护安全,或者远征,而骑士辉煌一生的事迹由谁来记录和歌颂呢,当然不会是自己了,这个完全可以由诗人去歌颂,比如当骑士出征的时候诗人可以去欢送,当骑士英勇牺牲的时候,诗人可以写诗歌颂骑士的一生.那么骑士只需要关注怎么打仗就好了.而诗人也只需要关注写诗歌颂和欢送就好了,那么这样就把功能分离了.所以可以把诗人当成一个切面,当骑士出征的前后诗人分别负责欢送和写诗歌颂(记录).而且,这个切面可以对多个骑士或者明人使用,并不只局

  • java Spring AOP详解及简单实例

    一.什么是AOP AOP(Aspect Oriented Programming)面向切面编程不同于OOP(Object Oriented Programming)面向对象编程,AOP是将程序的运行看成一个流程切面,其中可以在切面中的点嵌入程序. 举个例子,有一个People类,也有一个Servant仆人类,在People吃饭之前,Servant会准备饭,在People吃完饭之后,Servant会进行打扫,这就是典型的面向切面编程. 其流程图为: 二.Spring AOP实现: 1.People

  • Spring AOP的实现原理详解及实例

    Spring AOP的实现原理详解及实例 spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的. 以下是JDK动态代理和CGLIB代理简单介绍 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的实现类来完成对目标对象的代理. CGLIB代理:实现原理类似于JDK动态代理,只是它在运行期间生成的代理对象是针对目标类扩展的子类.CGLIB是高效的代码生成包,底层是依靠ASM(开源的Java字节码编辑类库)操作字节码实现的,性能比JDK强. 在Spring中

  • 利用spring AOP记录用户操作日志的方法示例

    前言 最近项目已经开发完成,但发现需要加用户操作日志,如果返回去加也不太现实,所以使用springAOP来完成比较合适.下面来一起看看详细的介绍: 注解工具类: @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogAnnotation { String operateModelNm() default ""; String operateFuncNm() default

  • Spring AOP 自定义注解的实现代码

    1.在Maven中加入以下以依赖: <!-- Spring AOP + AspectJ by shipengzhi --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>3.0.6.RELEASE</version> </dependency> <

  • spring AOP自定义注解方式实现日志管理的实例讲解

    今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接开始!!! 关于配置我还是的再说一遍. 在applicationContext-mvc.xml中要添加的 <mvc:annotation-driven /> <!-- 激活组件扫描功能,在包com.gcx及其子包下面自动扫描通过注解配置的组件 --> <context:component-scan base-package=&qu

  • 详解Spring AOP自定义可重复注解没有生效问题

    目录 1. 问题背景 2. 不啰嗦,上代码 3. 问题排查 3.1 是不是切点写得有问题,于是换成如下形式: 3.2 是不是使用的地方不是代理对象 4. 问题原因 1. 问题背景 工作中遇到这样的场景:某个方法需要在不同的业务场景下执行特定的逻辑,该方法已经上生产,不想改变原来的代码,因此决定用AOP做个切面执行逻辑. 2. 不啰嗦,上代码 以下为核心代码: 定义注解: @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(Rete

  • Spring AOP  基于注解详解及实例代码

    Spring AOP  基于注解详解及实例代码 1.启用spring对@AspectJ注解的支持: <beans xmlns:aop="http://www.springframework.org/schema/aop"...> <!--启动支持--> <aop:aspectj-autoproxy /> </beans> 也可以配置AnnotationAwareAspectJAutoProxyCreator Bean来启动Spring对@

  • Spring-基于Spring使用自定义注解及Aspect实现数据库切换操作

    实现思路 重写Spring的AbstractRoutingDataSource抽象类的determineCurrentLookupKey方法. 我们来看下Spring-AbstractRoutingDataSource的源码 AbstractRoutingDataSource获取数据源之前会先调用determineCurrentLookupKey方法查找当前的lookupKey. Object lookupKey = determineCurrentLookupKey(); DataSource

  • Spring Aop常见注解与执行顺序详解

    目录 Spring Aop 的常用注解 常见问题 示例代码 配置文件 接口类 实现类 aop 拦截器 测试类 执行结论 多切面的情况 代理失效场景 总结 Spring 一开始最强大的就是 IOC / AOP 两大核心功能,我们今天一起来学习一下 Spring AOP 常见注解和执行顺序. Spring Aop 的常用注解 首先我们一起来回顾一下 Spring Aop 中常用的几个注解: @Before 前置通知:目标方法之前执行 @After 后置通知:目标方法之后执行(始终执行) @After

  • Redis+AOP+自定义注解实现限流

    目录 Redis安装 下载 解压 准备编译 编译 测试编译 安装 配置 运行 检查端口是否在使用中 查看redis的当前版本: 使redis可以用systemd方式启动和管理 查看本地centos的版本: 客户端连接redis Redis限流 1.引入依赖 2.application.yml配置 3.创建redisConfig,引入redisTemplate 自定义注解和拦截器 1.自定义注解 2.创建拦截器 3.将自定义拦截器加入到拦截器列表中 Redis安装 一提到Redis,相信大家都不会

  • Spring AOP结合注解实现接口层操作日志记录

    目录 1.表和实体设计 1.实体设计 2.表结构设计 2.日志注解 3.核心AOP类 4.用到的工具类 5.测试类 6.测试结果 1.表和实体设计 1.实体设计 实体基类 @Data //映射将仅应用于其子类 @MappedSuperclass //指定要用于实体或映射超类的回调侦听器类.此注释可以应用于实体类或映射的超类. @EntityListeners(AuditingEntityListener.class) public class BaseEntity implements Seri

  • Spring AOP统一功能处理示例代码

    目录 1. 什么是Spring AOP? 2. 为什要用 AOP? 3. Spring AOP 应该怎么学习呢? 3.1AOP组成 3.1.1 切面(Aspect) 3.1.2 连接点(Join Point) 3.1.3 切点(Pointcut) 3.1.4 通知(Advice) 3.2 Spring AOP实现 3.2.1 添加 AOP 框架支持 3.2.2 定义切面和切点. 3.2.3 定义相关通知 3.3 Spring AOP 实现原理 3.3.1 动态代理 3.3.2 JDK和CGLIB

随机推荐