我有以下课程。
我在服务类中自动someDao
为@Autowired SomeDao someDao
。
我将服务中的逻辑称为someDao.getName(2);
public class SomeServiceImpl{
@Autowired SomeDao someDao
//call dao methods using someDao
}
public interface SomeDao{
String getName(Int id);
}
public class SomeDaoImpl implements SomeDao{
@CustomAnnotation("somevalue")
public String getName(int id){
//logic
}
}
@Around("execution(public * *(..)) && @annotation(com.mycompany.CustomAnnotation)")
public Object procedeNext(ProceedingJoinPoint call) throws Throwable {
//Access annotation value
MethodSignature signature = (MethodSignature) call.getSignature();
Method method = signature.getMethod();
CustomAnnotation myAnnotation = method.getAnnotation(CustomAnnotation.class);
String name = myAnnotation.value();
//here i am expecting name value "somevalue" but it is returning null
}
CustomAnnotation
有@Retention(RetentionPolicy.RUNTIME)
。
在上述方面,String name = myAnnotation.value();
应该给我somevalue
,但它会给null
。有什么建议吗?但是,如果我在界面中保留@CustomAnnotation("somevalue")
,那么它会给出价值。注释接口方法是否合适?
答案 0 :(得分:3)
这是因为默认的spring APO代理从接口而不是类中获取方法。所以当方法调用是接口而不是类时。
您有多种选择:
1.要么将xml配置更改为<aop:config proxy-target-class="true">
,它应该可以工作,因为代理将获取类而不是接口。如果你有几个xml aop配置,如果其中一个定位到目标类,那么所有这些都会做同样的事情,所以要小心。
2.或者你坚持使用默认值,然后将注释放在界面上。只要你小心注释,那就完全没问题。特别是如果你有交易。
3.可能有另一个使用方法调用的解决方案使用ClassUtils获取目标类来获取代理接口后面的类,但我并没有太多关注它。
希望这有帮助