Ich schreibe etwas AOP-Code mit sping3. Hier ist meine Anmerkung.Warum findAnnotation oder getAnnotation gibt null zurück?
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
String name() default "foo"
}
Und ich ein pointcut
auf die obige Anmerkung.
<aop:pointcut id="service" expression="@annotation(com.foo.datasource.DataSource)" />
<aop:advisor advice-ref="dataSourceExchange" pointcut-ref="service" order="1"/>
<bean id="dataSourceExchange" class="com.foo.datasource.DataSourceExchange"/>
Ich schreibe eine Service-Methode und füge die obige Annotation hinzu. In der Klasse DataSourceExchange
, die vor dem Dienst aufgerufen wird, versuche ich die Annotation zu bekommen.
class DataSourceExchange implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation invocation) throws Throwable {
System.out.println("Method name : "
+ invocation.getMethod().getName());
System.out.println("Method arguments : "
+ Arrays.toString(invocation.getArguments()));
DataSource dataSource = AnnotationUtils.findAnnotation(invocation.getMethod(), DataSource.class);
System.out.println(dataSource);
Ich bekomme den Namen der Methode richtig. Aber die Annotation dataSource
gibt nur null
zurück. Was ist das Problem? Ich denke, dass die Service-Methode, die ich angerufen habe, definitiv annotation-ed ist, andernfalls wird es das pointcut
nicht auslösen.