使用注解实现AOP功能

最近做项目,需要使用注解绑定一个切面去实现一个需求,讲真的本人菜鸟,可能之前就没有写多少切面,更不要说用注解的形式去实现了,现学现卖,希望写点东西,随着理解的深入可能我会修改这篇博客。闲话少说,首先是些注解的编写:
一.注解(Annotation):
编写注解必须要了解元注解的概念,其实就是定义注解的注解,meta-Annotation,Java1.5以后一共定义了四个元注解,
    1.@Target,
    2.@Retention,
    3.@Documented,
    4.@Inherited
1.@Target:这个元注解比较常用,作用是定义注解可以用在什么地方。
而ElementType是定义其作用范围的参数, 取值(ElementType)有:

    1.CONSTRUCTOR:用于描述构造器
    2.FIELD:用于描述域
    3.LOCAL_VARIABLE:用于描述局部变量
    4.METHOD:用于描述方法
    5.PACKAGE:用于描述包
    6.PARAMETER:用于描述参数
    7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Target(ElementType.METHOD) //作用于方法
@Target(ElementType.TYPE)  //作用于类
@Target({ElementType.METHOD,ElementType.TYPE})//或者作用于方法和类

2.@Retention:这个注解也是比较常用的注解,
这是一个描述什么时候有效的注解,有三中描述参数:
    1.SOURCE:在源文件中有效
    2.CLASS:在class文件中有效
    3.RUNTIME:在运行时有效
前两个比较特殊,也不常见,我们常常使用的这个RUNTIME,
还有@Documented和@Inherited这两个参数,比较不常用,基本我这里用不到,感兴趣,大家可以自己了解一下。
这里注意,我们自己定义的注解自动继承,java.lang.annotation.Annotation接口,
例:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface SystemLog{ //SystemLog是注解名称
    String module() default "默认模块";
}

好了,让我们看看如何让注解和切面绑定到一起,

    package com.demo;
    @Aspect  
    @Component  //这两个注解必须要有,项目跑起来时候,这两个注解会被扫描到,告诉容器这是一个切面 组件
    public class LogAspect {

    @Around("@annotation(com.demo.SystemLog)") //没错 这里是重点
    public void afterLogService(JoinPoint point){
        //获得当前访问的类
        Class<?> className = point.getTarget().getClass();
        //获得当前的方法名
        String methodName = point.getSignature().getName();
        //得到方法的参数类型
        Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
        //默认的
        String module = "默认的模块";
        try {
            //得到访问的方法对象
            Method method = className.getMethod(methodName,argClass);
            //如果这个方法上有我的注解
            if (method.isAnnotationPresent(SystemLog.class)) {
                //那就获取我的这个注解
                SystemLog log = method.getAnnotation(SystemLog.class);
                module = log.module();
                logService.insertLog(module,operation);
            }
    }

    }

这里基本就处理完毕了,你可以在省略部分写你自己的业务逻辑了,使用的时候在你想切的方法或者类上,写上这个注解就可以了。
这里简单的说一下JoinPoint ,切入点这里面有提供了不少的方法,包含可以点击进去看一下,源码注解写的很详细,感兴趣可以看一下。这里比较常用的可能是

Object getThis(); 
Object getTarget(); //返回当前执行的对象
Object[] getArgs(); //返回当前执行的数组对象
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 使用Spring的AOP可以实现缓存功能。具体实现方式是,在需要缓存的方法上添加@Cacheable注解指定缓存的key和缓存的名称。当方法被调用时,Spring会先检查缓存中是否存在该key对应的缓存数据,如果存在则直接返回缓存数据,否则执行方法并将返回结果缓存起来。同时,还可以使用@CachePut注解更新缓存数据,或者使用@CacheEvict注解清除缓存数据。这样可以有效地提高系统性能和响应速度。 ### 回答2: 使用Spring的AOP实现缓存功能的步骤如下: 1. 首先,需要在Spring配置文件中启用AOP功能,可以通过添加`<aop:aspectj-autoproxy/>`来实现。 2. 然后,创建一个用于缓存方法调用结果的类,该类需要实现`org.springframework.cache.Cache`接口,并提供对缓存的读取、写入、删除等操作方法。 3. 还需要创建一个切面类,该类需要使用`@Aspect`注解进行标记,并在需要缓存的方法上添加`@Cacheable`注解。在切面类中,使用`@Before`和`@After`等注解来定义缓存操作的切点和通知。 4. 在Spring配置文件中,将切面类声明为一个bean,并在`<aop:config>`中指定要应用缓存的方法和切面。 5. 最后,配置`ehcache.xml`(或其他缓存配置文件),并将其指定为Spring配置文件中缓存管理器的实现类,例如`<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"/>`。 这样,当被缓存的方法被调用时,AOP将切入切面类的通知方法,首先查询缓存是否存在该方法的结果,如果存在,则直接返回缓存中的结果;如果不存在,则调用原始方法,并将结果存入缓存中。在后续的调用中,如果参数相同,则直接从缓存中获取结果,从而减少了对原始方法的调用,提高了系统的性能和响应速度。 使用Spring的AOP实现缓存功能可以大大简化代码,提高项目的可维护性和可扩展性,同时还能通过缓存数据减少对数据库等资源的访问,提升系统整体的性能。 ### 回答3: 使用Spring的AOP可以很方便地实现缓存功能AOP(面向切面编程)是一种编程范式,通过在程序运行时动态地将横切逻辑(如日志记录、事务管理、异常处理等)插入到应用程序的特定位置,以提供更好的代码结构和模块化。 在使用Spring的AOP实现缓存功能时,我们可以通过以下步骤来实现: 1. 定义一个缓存注解:可以使用Spring提供的@Cacheable注解来定义缓存的方法。这个注解可以应用在方法上,用于标记被缓存的方法。 2. 配置缓存切面:通过AOP切面配置,将缓存注解和具体的缓存实现关联起来。可以使用Spring的@Aspect注解来定义一个切面类,该类可以包含多个增强方法用于处理缓存操作。 3. 配置缓存策略:在切面类中,可以通过使用Spring的缓存管理器(如Ehcache、Redis等)来定义缓存的具体策略。可以配置缓存的过期时间、缓存的存储位置等。 4. 在目标方法中使用缓存注解:在需要被缓存的方法上添加之前定义的缓存注解。当方法被调用时,AOP切面会先检查缓存中是否存在对应的缓存数据,如果存在则直接返回缓存数据,否则执行方法逻辑并将结果存入缓存。 5. 测试缓存功能:执行目标方法,观察是否从缓存中获取数据以及方法执行的时间。 通过这种方式,我们可以很方便地在应用中加入缓存功能,提高系统性能和响应速度。同时,由于使用AOP的方式,可以很好地解耦和复用缓存相关的代码逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值