AOP切mybatis的mapper接口,切不到接口上的annotation 100C

如题,一个springboot项目,mapper接口上有自定义的类型级注解PrivateDatasource,
表达式如下:
@Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && @target(privateDatasource)")
切接口是切不到注解,但是自己给一个普通类上加上注解就可以切到,请问有大佬能给解答一下么

切面类:
@Aspect
@Component
public class DataSourceAspect {
@Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && ( @target(privateDatasource) || @annotation(privateDatasource) )")
public Object beforeMapper(ProceedingJoinPoint joinPoint,PrivateDatasource privateDatasource){
Signature sig = joinPoint.getSignature();
String method = sig.getName();
System.out.println("方法名:"+sig.getName());
if(privateDatasource == null){
Object target = joinPoint.getTarget();
privateDatasource = target.getClass().getAnnotation(PrivateDatasource.class);
}
System.out.println(privateDatasource.value());
return null;
}
}
mapper接口:
@PrivateDatasource
public interface CompanyMapper
同一路径下的用于测试的类:
@PrivateDatasource
@Component
public class Test {
public void say(){
System.out.println("test");
}
}
根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的

2
youxiu326
youxiu326 springboot 2x版本可以拦截到
5 天之前 回复
qq_34382367
Jason.Tang annotation是切不到的,但是可以通过execution的方式可以切到,在依赖注入DAO的地方加上@Lazy即可,如果切的地方不同的类型的时候可以加自定义注解作为区分
5 个月之前 回复

9个回答

切面类:
@Aspect
@Component
public class DataSourceAspect {
@Around("execution(* com.nbst.dao.mapper.idevcloudweb.*.*(..)) && ( @target(privateDatasource) || @annotation(privateDatasource) )")
public Object beforeMapper(ProceedingJoinPoint joinPoint,PrivateDatasource privateDatasource){
Signature sig = joinPoint.getSignature();
String method = sig.getName();
System.out.println("方法名:"+sig.getName());
if(privateDatasource == null){
Object target = joinPoint.getTarget();
privateDatasource = target.getClass().getAnnotation(PrivateDatasource.class);
}
System.out.println(privateDatasource.value());
return null;
}
}
mapper接口:
@PrivateDatasource
public interface CompanyMapper
同一路径下的用于测试的类:
@PrivateDatasource
@Component
public class Test {
public void say(){
System.out.println("test");
}
}
根本切不到带注解的接口,也就是无法注入注解对象作为参数,但是普通类是可以切到、并且将注解对象作为参数注入的

1

可以发代码研究下。。。。。。

0
zm12397
zm12397 您好,代码发在上面了
一年多之前 回复

springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
加上这个配置就是强制使用cglib代理

0
zm12397
zm12397 这个没有影响的,把@target去掉只用包的路径来切的话是可以切到接口的,打印出来目标对象其实是代理对象,但是代理对象反射发现没有注解,所以问题应该还是注解上。。
一年多之前 回复

0

图片说明
这段配置加上去试试,默认使用cglib代理的,代码好像贴上去好像不显示

0
wb_snail
wb_snail 回复zm12397: 哦好吧,这样应该是不行的,mybatis会动态创建mapper接口的实现类去执行sql,而你用aop加在接口上,代理实现方式也是动态创建接口的实现类然后切入点的前后加上你要加的逻辑,除非mybatis和spring aop为这个接口创建的是一个实现类,不然就不能实现你的功能,你可以把切入点写在调用dao的service方法上
一年多之前 回复
zm12397
zm12397 回复wb_snail: mybatis的mapper接口,没用实现类
一年多之前 回复
wb_snail
wb_snail 回复zm12397: 接口的实现类和实现方法呢,贴来看看
一年多之前 回复
zm12397
zm12397 这个没有影响的,把@target去掉只用包的路径来切的话是可以切到接口的,打印出来目标对象其实是代理对象,但是代理对象反射发现没有注解,所以问题应该还是注解上。。
一年多之前 回复

反射打印下发现普通类切到了,而且注解作为参数是可以拿到的
方法名:say
注解:@com.nbst.annotation.PrivateDatasource(value=PUBLIC)
但是接口的还是不行,注解根本注入不进去
方法名:findByCondition
注解:null

0

springAOP基于动态代理,有两种方式,一种是默认的基于jdk动态代理,这种是不能对接口进行代理的
还有一种是基于cglib的代理 这种接口也可以代理,我估计你是没有开启cglib代理,就是默认的jdk代理,
加上这个配置就是强制使用cglib代理

0

你得吧这个类给ioc容器,就是交给spring管理,也就是@Component,spring才能管理,才会知道给你的切点进行增强处理。

0

切不了,源码中明确写了,判断的是target method上的注解,你注解定义在接口上,这个接口的实现类上没用注解,那么就判断这个实现类方法不被拦截,因为一个实现类能够实现多个接口,为了避免多接口方法同注解的情况,aspectjweaver.jar中并没有实现接口方法上注解的处理,你可以自己改写pectjweaver.jar中org.aspectj.weaver.reflect.ReflectionBasedResolvedMemberImpl.unpackAnnotations()方法

-1
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
mybatis学习总结:annotation与xml结合示例
简介   在之前的文章里讨论过mybatis纯xml或者annotation的开发。同时,也讨论了针对不同对象关系情况下的实现细节。在实际的开发应用中,我们会发现,有时候单纯的使用某一种方式来开发的话并不一定有最佳的效率。比如说当我们使用纯xml的时候,会发现里面有很多比较繁琐的配置,而且因为很多sql语句因为是写在xml配置文件里,一个是容易出错,另外对于一些特殊符号还要做一些处理,这样就...
mybatis 拦截器 + spring aop切面 + spring事务+ 反射工具类
内含有mybatis 拦截器实现的分页代码,spring 的事务和aop 测试、和反射工具类
接口方法上的注解无法被@Aspect声明的切面拦截的原因分析
今天项目遇到大坑,以前做多数据源springboot都是用的2.0.1版本,这一次项目组用的脚手架采用1.0.5搭建,拷贝以前的多数据源配置发现mapper接口的注解进不了aop,原来是版本问题 https://my.oschina.net/guangshan/blog/1808373#h2_4 解决方式: 不用注解方式启动aop,采用扫描mapper下所有接口任意方法来启动aop切面,再扫描ma...
对@Repository注解的mybatis接口中的方法进行AOP拦截无效
实际情况是不光对@Repository注解的mybatis接口中的方法进行AOP拦截无效。如果对Service层的接口中的方法进行拦截也不生效,只有对Service接口的实现类中的方法进行拦截才生效。对Mybatis的写操作进行拦截可以使用mybatis提供的插件(plugin)中的Interceptor来实现 ...
Spring+SpringMVC+Mybatis 利用AOP自定义注解实现可配置日
目的: 需要对一些事物的操作进行日志记录,如果在service内进行记录,大量的代码重复,并且维护比较麻烦。所以采用AOP的方式对service进行拦截。使用自定义注解的目的则是判断是否需要记录日志和传递额外的信息。 方式 本次解决方案十分感谢博主-跳刀的兔子的博文 本文绝大部分参考与本文,略有不同,所以做一些整理,博主的文章更详细一些。 1.首先新建自定义注解
通过aop拦截mybatis接口dao
最近开发的客服系统遇到了这样一个问题:微信渠道发送消息时如果nickname带有emoji表情,后台则会报消息无法插入数据库的错误,导致微信端一直无法进入人工,错误如下: 经查证,是由于后台在使用mybatis插入数据库时没有对emoji做转换处理,导致无法插入数据库,故而报错 由于mybatis使用的接口的形式跟mysql映射的,刚开始还以为aop无法拦截接口,结果验证,ao
关于spring aop对接口方法上的注解无法拦截问题
最近实现一个功能,在访问dao层方法前需要切换数据源,通过自定义注解+AOP实现。AOP中拦截被注解了的方法,实现数据源切换。Dao层用mybatis实现,注解加载Mapper接口中的方法上,但是AOP无法对加了自定义注解的方法进行拦截。由此做了以下总结:一、关于注解继承问题对于接口,在接口中的注解无论如何都不能被继承,不论是子接口继承父接口的情况还是接口的实现类的情况,不论是对接口上还是接口中的...
利用自定义注解 为个别的接口做AOP切面
import com.alibaba.fastjson.JSON; import org.apache.shiro.SecurityUtils; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspe
使用Spring AOP切面解决数据库读写分离
为了减轻数据库的压力,一般会使用数据库主从(master/slave)的方式,但是这种方式会给应用程序带来一定的麻烦,比如说,应用程序如何做到把数据写到master库,而读取数据的时候,从slave库读取。如果应用程序判断失误,把数据写入到slave库,会给系统造成致命的打击。 解决读写分离的方案很多,常用的有SQL解析、动态设置数据源。SQL解析主要是通过分析sql语句是insert/se
接口实现时Spring AOP切入点注意事项
最近好多人问我说我的我的切入点没有错误啊,怎么不起作用?而且大部分情况都是写AOP切入点时带有类继承或接口实现时出现的问题。在此总结一下,方便后人查阅。而且建议使用如IntelliJ IDEA、STS或者Eclipse装AspectJ插件自动显示切入点是否匹配目标对象/目标方法。   1、相关类 1.1、抽象基类 我们在写一些项目时,都会抽象一些基类,比如DAO、Servi
标注在接口上的注解无效,无法使用aop拦截,即使声明了@Inherited
通常我们会通过实现一个接口来编写一个类,为了省事,我将注解直接标注在了接口的方法上,实验发现通过aop并没有拦截到该注解,即使在定义注解时使用了@Inherited元注解。 通过阅读@Inherited注解的源码,可以发现: package java.lang.annotation; /** * Indicates that an annotation type is automati...
7、AOP、异常、整合mybatis
1、AOP用来验证用户是否已经登陆定义一个切面类,访问指定的方法就会触发切面。@Aspect @Component @Slf4j public class SellerAuthorizeAspect { @Pointcut("execution(public * com.snail.controller.Seller*.*(..))" + "&& !execution(
利用AOP编程完成mybatis 动态切换数据源
mybatis 实现接口和xml的绑定。sql的执行等一系列处理。当我们在使用过程中需要从A服务器数据库查询某张表。B服务器数据库查询另一张表又该怎么做呢? 实现思路 1、配置多个dataSource。 2、设置主从关系 3、定义切面监控所有 mybatis接口。。 4、利用@around注解完成对执行接口类方法的数据源切换。 5、写工具类完成切换 第一步、app
AOP切面切入可能遇到的问题
工作中改造原有项目,在AOP切入日志的时候出现了一些意料之外的问题。 这篇文章只讨论通过注解的方式进行切入,不讨论通过配置文件进行切入 @Aspect注解无效 @Aspect对整个项目都无效,而且编译、运行没问题,就是不执行切面中的方法 1、引入包及版本检查:   先查看jar包是否引用完整及版本号是否匹配,以及框架(Spring、SpringMVC、Mybatis;Spring、Spr...
【AOP】通过AOP实现MyBatis多数据源的动态切换
         以前转载过一个关于多数据库的文章,写的很好,也很不多,是在方法上自动切换数据库。方便快捷。        在后面的工作中,有一个项目也需要用到多数据库,但是是在一个方法中,里面涉及到两个查询,可能还要和线程进行绑定。这就涉及到在查询的时候切换数据库。这个文章写的也很不错。现在分享给大家。        【环境参数】1.开发框架:Spring + SpringMVC + MyBat...
@Aspect 获取方法上的注解,类上的注解,接口上的注解 笔记记录
注意点 ProceedingJoinPoint point 代码 @Component @Slf4j @Aspect public class ManageLoginAop { private static final String MANAGE_LOGIN_JSP = "/finance/manage/login"; // private static final String L...
AOP解密-----用接口改造AOP
优化是个无止境的工作,在AOP的路上,我们走得很远,但是还有很多的工作,我们没有做,比如,将aop的业务部分封装成容器,将aop的服务部分改造成面向接口的,这样就不受具体的形式上的限制了!这样AOP的优化,就又前进了一步,也是符合咱们的面向接口编程的思想,下面就和我一起研究下如何将接口的思想融入到aop的实现中。 回顾: 在上篇博客中,我们将aop的服务封装到了容器中:
Mybatis 获取不到接口参数问题
问题描述:持久层使用Dao接口+实现类,在实现类里通过sqlSession调用selectXXX方法获取数据的时候未报错但是取到的数据一直为空后面经过测试发现原因是mapper映射文件中的sql语句无法获取参数,之前使用的是#{参数名}无效,想到在参数上添加注解@Param(参数名)无效,换成#{占位符}依然无效。最后发现原因是因为使用了接口的实现类,mybatis就无法获取属性了[具体原因还不清楚
Spring配置加事物加扫描dao层 加增强的AOP切面方法
例子:增强Service层记录时间的方法
spring AOP标注型切点(@annotation)的问题
在面向切面编程方面我自己比较喜欢spring的标注型切点的做法
spring&mybatis整合--Mapper接口注解配置整合
spring&mybatis整合--Mapper接口注解配置整合1.创建一个Java工程2.导入jar包3.数据库准备4.创建实体5.创建增强类6.创建日志配置7.创建工具类8.配置数据源9.创建自定义注解10.创建工程配置10.增加服务11.增加Dao12.服务的实现13.Dao的实现14.编写测试类15.运行结果 1.创建一个Java工程 2.导入jar包 3.数据库准备 -- ...
mybatis如何根据mapper接口执行sql
今天在工作中老大突然问了我一个问题,就是mybatis如何根据mapper接口来执行sql的,我一下就懵了,自己一直以来就是这么用的,还从来没有思考过这个问题,那么底层究竟是如何来调用的呢?带着这个问题,好好百度了一下,结合自己的项目和理解,写下来加深下印象,如果有不对的,各位大神轻拍。 首先看看项目中的配置,我们是这么配的,因为是分布式+springBoot,项目中的粒度做得很细,一个
解决AOP中代理获取不到Annotation的问题
今天想使用aop写一个缓存同步的注解遇到了一个问题 我用MethodSignature.getMethod();方法得不到目标对象的注解 @After("@annotation(com.art.annotation.DeleteRedisCache)") public void deleteCacheById(JoinPoint joinPoint) { MethodSignatur...
spring mybatis 用注解方式实现动态切切换数据源
用注解方式实现动态切切换数据源
Spring Aop Cglib 切没有接口的实现类
用kenoAspect去切 A1335_ValidPrize类的中volidVO,doaction方法    cglib的jar包     <!-- cglib统计用 -->         <dependency>             <groupId>cglib</groupId>             <artifac...
MyBatis Spring 集成,mapper接口@repository有时候却不用写的原因(MyBatis Spring 集成源码解析)
之前看了Spring源码之后,对Spring+MyBatis项目有个疑问,Dao层的mapper接口上@repository有时候却不用写,难道mapper包扫描生成代理类发生在service层的依赖注入之前吗?要不然service层的类@Autowired mapper接口时会找不到实例啊? 后面读了MyBatis Spring 集成源码MapperScannerConfigurer后解决了疑...
mybatis建立接口注释sql
mybatis建立接口注释sql,可以不用配置类似user.xml文件 1、创建一个接口:IUser,并在其中声明对应的操作方法 在 src 源码目录下创建一个包:com.yiibai.mybatis.dao,并建立接口类 IUser 及一个方法, 在方法上面,我们使用了一个SQL注释,内容如下: package com.yiibai.mybatis.dao; import org.apa...
aop自定义切面
先定义注解package com.nington.armstrong.aspect.annotation;import java.lang.annotation.*;/** * Created by dubby on 16/3/23. */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolic
spring中aop无法切到service内部调用的方法
首先,特别鸣谢周先生做的测试代码。一。场景描述 有一个控制层类OutStoreOverController(简称controller),依赖了XsCustomorExpenseOperateServiceImpl(简称service)类。controller在2个不同方法中分别调用了service的siteDeliverySettlement 和stockDownAccounts方法(分别简称为m...
spring mybatis mapper接口注解方式注入
最近做项目使用mybatis-generator生成mybatis的mapper.xml映射文件和mapper接口。 原来采用spring-bean的方式显示注入,代码如下:<bean id="articleMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface
Spring aop切入方法都用不到
每次自己弄aop切入总是按照网上教程配置好总是调用不到,每次还得费时间查询,先记录下来,省得以后再犯同样的错误 使用了spring mvc后,如果把放在application.xml文件中可能会aop无效,最好把它放在dispatcher-servlet.xml文件中
关于spring aop代理不到父接口中的方法
可能你的项目是这样的架构: public interface BaseDaoT> {} public class BaseDaoImplT> implements BaseDaoT> {} public interface UserService extends BaseDao {} public class UserServiceImpl extends BaseDaoImp
SpringAop编程中切入点表达式为接口类
代理模式分为三种代理 一:静态代理:静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类. 二;JDK代理:目标对象必须有接口(通过实现接口类进行代理) 1.代理对象,不需要实现接口 2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象(需要我们指定创建代理对象/目标对象实现的接口的类型) 3.动态代理也叫做:JDK代理,接口代理 ...
mybatis从mapper接口传递参数到XML总结
待写
AOP切面编程(必须实现统一接口),spring中的配置示例
   &amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt; &amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;              xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;              xmlns...
MyBatis框架核心之(三)注解使用接口映射
二、Mybatis接口映射(注解) 传统的mapper.xml+接口使用接口映射相对较麻烦 所以我们可以使用注解来简化开发   支持的注解有以下: MyBatis可以利用SQL映射文件来配置,也可以利用Annotation来设置。MyBatis提供的一些基本注解如下表所示。 注解 目标 相对应的 XML 描述 @C
spring切面:接口:前后置增强
1.前置增强接口实现类package aop;import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays;import org.apache.log4j.Logger; import org.springframework.aop.MethodBeforeAdvice;public clas
接口入参注解aop验证
为什么要入参验证         系统之间在进行接口调用时,往往是有入参传递的,入参是接口业务逻辑实现的先决条件,有时入参的缺失或错误会导致业务逻辑的异常,大量的异常捕获无疑增加了接口实现的复杂度,也让代码显得雍肿冗长,因此提前对入参进行验证是有必要的,可以提前处理入参数据的异常,并封装好异常转化成结果对象返回给调用方,也让业务逻辑解耦变得独立。 为什么要使用aop方式         入参验证
使用aop代理获取不到Annotation注解问题
问题场景:使用aop切面方法执行一些业务,过程中查看执行的方法是否有一个自定义的注解,有的话做其他的操作 这里碰到了一个问题 ,执行的方法有注解,但是通过Annotation an = method.getAnnotation(UserChangeLog.class); 取值为null.具体情况和此篇文章类似:示例其实问题很简单,是代理对象和目标对象的问题,通过代理模式生成代理对象上的方法不会有注解
spring使用AOP技术对DAO层操作进行增强功能
AOP的概述1. 什么是AOP的技术? * 在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程 * AOP是一种编程范式,隶属于软工范畴,指导开发者如何组织程序结构 * AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范 * 通过预编译方式和运行期动态代理实
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 web切换卡教程 切水果网页游戏制作视频