我有以下课程。
我在服务类中将someDao
自动布线为@Autowired SomeDao someDao
。
我称服务中的逻辑为someDao.getName(2);
SomeServiceImpl.java
public class SomeServiceImpl{
@Autowired SomeDao someDao
//call dao methods using someDao
}
SomeDao.java
public interface SomeDao{
String getName(Int id);
}
SomeDaoImpl.java
public class SomeDaoImpl implements SomeDao{
@CustomAnnotation("somevalue")
public String getName(int id){
//logic
}
}
SomeAspect.java
@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")
,那么它会带来价值。注释接口方法好吗? 最佳答案
这是因为默认的spring APO代理从接口而不是从类获取方法。因此,当方法调用是接口调用而不是类调用时。
您有几种选择:
1.您将xml配置更改为<aop:config proxy-target-class="true">
,并且它应该可以工作,因为代理将获取类而不是接口。如果您有多个xml aop配置,并且其中一个以目标类为目标,则所有它们都将执行相同操作,因此请小心。
2.或者您坚持使用默认值,然后将注释放在界面上。只要注意注释,该方法就可以很好地工作。特别是如果您有交易。
3.可能还有另一种解决方法,使用方法调用使用ClassUtils获取目标类,以使该类位于代理接口的后面,但我对此并没有做太多研究。
希望这可以帮助