业务层的service是继承了baseservice,在baseservice中用了泛型注入具体的dao和entity实现了基本的增删查改操作,具体形式如下:
public interface BaseService<T>{}
public class BaseServiceImpl<D extends BaseMapper<T>, T extends BaseEntity<T>> implements BaseService<T>{}
业务类实现形式如下:
public interface UserService extends BaseService<User>{}
public class UserServiceImpl extends BaseServiceImpl<UserMapper, User> implements UserService{}
然后在具体的业务类中会根据需求重写baseservice的方法,并且用annotation做了切面,现在发现一个问题,在baseservice中用泛型做参数的方法无法无法实现切面操作,不能被aspect拦截。比如
baseservice中定义了这样一个方法:
int update(T entity)
在业务类中重写如下:
@annotation
public int update(final User entity) {
return super.update(entity);
}
会出现annotation无法拦截到这个方法的情况,但是如果baseservice中方法的参数里不用泛型就没问题,比如另外一个方法:
T get(String id)
业务service重写如下:
@annotation
public User get(final String uuid) {
return super.get(uuid);
}
这种写法就能被aop正常代理。
aop的拦截方法写法如下:
@Around("@annotation(annotation)")
目前项目是正常在运行,所以aop本身是有效的,出现的问题是做某些方法改造的时候发现的。不清楚aspect在什么情况下会出现无效的情况,网上找了不少资料似乎也没有一个讲得很清楚的,特别是对这种因为泛型引起的失效问题,不知道有没有人碰到过?如何解决?
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…