mam tej konfiguracji wiosny:Jak mogę znaleźć wszystkie fasolki z niestandardową adnotacją @Foo?
@Lazy
@Configuration
public class MyAppConfig {
@Foo @Bean
public IFooService service1() { return new SpecialFooServiceImpl(); }
}
Jak mogę uzyskać listę wszystkich ziaren, które są opatrzone @Foo
?
Uwaga: @Foo
to niestandardowa adnotacja zdefiniowana przeze mnie. To nie jest jedna z "oficjalnych" adnotacji wiosennych.
[EDIT] Po sugestii Avinash T., napisałem ten przypadek testowy:
import static org.junit.Assert.*;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.reflect.Method;
import java.util.Map;
import org.junit.Test;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
public class CustomAnnotationsTest {
@Test
public void testFindByAnnotation() throws Exception {
AnnotationConfigApplicationContext appContext = new AnnotationConfigApplicationContext(CustomAnnotationsSpringCfg.class);
Method m = CustomAnnotationsSpringCfg.class.getMethod("a");
assertNotNull(m);
assertNotNull(m.getAnnotation(Foo.class));
BeanDefinition bdf = appContext.getBeanFactory().getBeanDefinition("a");
// Is there a way to list all annotations of bdf?
Map<String, Object> beans = appContext.getBeansWithAnnotation(Foo.class);
assertEquals("[a]", beans.keySet().toString());
}
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public static @interface Foo {
}
public static class Named {
private final String name;
public Named(String name) {
this.name = name;
}
@Override
public String toString() {
return name;
}
}
@Lazy
@Configuration
public static class CustomAnnotationsSpringCfg {
@Foo @Bean public Named a() { return new Named("a"); }
@Bean public Named b() { return new Named("b"); }
}
}
ale nie jest on z org.junit.ComparisonFailure: expected:<[[a]]> but was:<[[]]>
. Czemu?
Dzięki, zupełnie to przegapiłem.Napisałem test, ale test się nie udał (zobacz moje edytowane pytanie). Każdy pomysł, dlaczego? –
@AaronDigulla ..... twój assertEquals() rzuca ten wyjątek. –
Dzieje się tak, ponieważ 'getBeansWithAnnotation()' zwraca pustą mapę -> nie znajduje żadnych fasoli. Dlaczego? –