资讯专栏INFORMATION COLUMN

像@Transactional一样利用注解自定义aop切片

zhangke3016 / 2713人阅读

摘要:像一样利用注解自定义切片在中,利用注解可以很轻松的利用技术进行事物管理。表明该注解在运行时也是有效的。其中用来声明切片的实现。在这个代码里面,最关键的一步是这个声明与普通的注解式声明切片类似,只是其中表明该切片作用范围为声明的注解作用范围。

像@Transactional一样利用注解自定义aop切片

在spring中,利用@Transactional注解可以很轻松的利用aop技术进行事物管理。在实际项目中,直接利用自定义注解实现切片可以大大的提高我们的编码效率以及代码的简洁性。

实现以上的目标,主要涉及两方面工作。

自定义注解

将注解声明为切片

自定义注解

介绍注解自定义的文章比较多,这里简要介绍一下以下面的代码为例。该代码要实现一个分布式锁的代码。首先利用@interface来声明该类为接口类,用@Target来声明该注解的作用范围。该例子中ElementType.METHOD, ElementType.TYPE表明该注解作用范围是方法和类。@Retention注明该注解的作用周期。RetentionPolicy.RUNTIME表明该注解在运行时也是有效的。

package com.whaty.lock.annotation;

import org.springframework.stereotype.Component;

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

@Component
@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(value = RetentionPolicy.RUNTIME)
public @interface Lock {

    public LockImpl lockImpl() default LockImpl.MYSQL;

    public enum LockImpl {
        MYSQL, ZOOKEEPER
    }
}
将注解声明为切片

下面的代码是实现注解切片逻辑的代码。其中@Aspect用来声明切片的实现。在这个代码里面,最关键的一步是
@Around(value = "@annotation(com.whaty.lock.annotation.Lock)")
这个声明与普通的注解式声明切片类似,只是其中@annotation表明该切片作用范围为声明的注解作用范围。

package com.whaty.lock.aspect;

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

@Component
@Aspect
public class LockAspect {
    @Around(value = "@annotation(com.whaty.lock.annotation.Lock)")
    void execute(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        // 尝试获取锁
        proceedingJoinPoint.proceed();
        // 释放锁
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64987.html

相关文章

  • Spring知识——事务解析

    摘要:编程式事务指的是通过编码方式实现事务声明式事务基于将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件中做相关的事务规则声明,另一种是基于注解的方式。 事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式...

    tuomao 评论0 收藏0
  • 【Spring】一次线上@Transational事务注解未生效的原因探究

    摘要:由于的限制,无法替换被代理类已经被载入的字节码,只能生成并载入一个新的子类作为代理类,被代理类的字节码依然存在于中。区别于前两者,是一种静态代理的实现,即在编译时或者载入类时直接修改被代理类文件的字节码,而非运行时实时生成代理。 现象描述 上周同事发现其基于mySql实现的分布式锁的线上代码存在问题,代码简化如下: @Controller class XService { @A...

    姘存按 评论0 收藏0
  • Aop?看这篇文章就够了!!!

    摘要:又是什么其实就是一种实现动态代理的技术,利用了开源包,先将代理对象类的文件加载进来,之后通过修改其字节码并且生成子类。 在实际研发中,Spring是我们经常会使用的框架,毕竟它们太火了,也因此Spring相关的知识点也是面试必问点,今天我们就大话Aop。特地在周末推文,因为该篇文章阅读起来还是比较轻松诙谐的,当然了,更主要的是周末的我也在充电学习,希望有追求的朋友们也尽量不要放过周末时...

    boredream 评论0 收藏0
  • 在同一个类中调用另一个方法没有触发 Spring AOP 的问题

    摘要:起因考虑如下一个例子定义在这个例子中我们定义了一个注解这个是一个方法注解我们的期望是当有此注解的方法被调用时需要执行指定的切面逻辑即执行方法在类中方法被所注解因此调用方法时应该会触发方法的调用不过有一点我 起因 考虑如下一个例子: @Target(value = {ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Doc...

    yimo 评论0 收藏0
  • 慕课网_《Spring入门篇》学习总结

    摘要:入门篇学习总结时间年月日星期三说明本文部分内容均来自慕课网。主要的功能是日志记录,性能统计,安全控制,事务处理,异常处理等等。 《Spring入门篇》学习总结 时间:2017年1月18日星期三说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学示例源码:https://github.com/zccodere/s...个人学习源码:https://git...

    Ververica 评论0 收藏0

发表评论

0条评论

zhangke3016

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<