2013-06-20 2 views
0

Я хочу создать пользовательскую пружинную аннотацию, которая будет работать при некоторых условиях или параметрах. Но в качестве ограничения для бизнеса мне нужно поделиться библиотекой, которая имеет аннотацию Genre ко всем моим приложениям. Можно ли настроить мою аннотацию для ограничения некоторых моих приложений, таких как аннотация @Profile?Ограничение пользовательской аннотации для весеннего приложения

@Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) 
@Qualifier 
public @interface Genre { 
    String value(); 
} 

и его использование

public class MovieRecommender { 
@Autowired 

    @Genre("Action") 
    private MovieCatalog actionCatalog; 

    private MovieCatalog comedyCatalog; 

    @Autowired 
    public void setComedyCatalog(@Genre("Comedy") MovieCatalog comedyCatalog) { 
     this.comedyCatalog = comedyCatalog; 
    } 
// ... 
} 

ответ

0

Я не думаю, что можно изменить поведение @Autowired аннотацию.

Однако вы можете легко реализовать свой собственный BeanPostProcessor и использовать все удобства пружине классы, такие как AnnotationUtils, ReflectionUtils и т.д.

На одном проекте мы нуждались пользовательские JAX-WS инъекции порта. Таким образом, мы создали @InjectedPort аннотацию и реализовать наши собственные InjectedPortAnnotationBeanPostProcessor (это как раз иллюстрирует простоту пользовательского литьевого логики, цель самого кода не имеет никакого отношения к вопросу):

@Override 
public Object postProcessBeforeInitialization(final Object bean, String beanName) { 
    // Walk through class fields and check InjectedPort annotation presence 
    ReflectionUtils.doWithFields(bean.getClass(), new FieldCallback() { 
     @Override 
     public void doWith(final Field field) { 
      // Find InjectedPort annotation 
      final InjectedPort injectedPort = field.getAnnotation(InjectedPort.class); 
      if (injectedPort == null) { 
       return; // Annotation is not present 
      } 
      // Get web service class from the annotation parameter 
      Class<?> serviceClass = injectedPort.value(); 
      // Find web service annotation on the specified class 
      WebServiceClient serviceAnnotation = AnnotationUtils.findAnnotation(serviceClass, WebServiceClient.class); 
      if (serviceAnnotation == null) { 
       throw new IllegalStateException("Missing WebService " + "annotation on '" + serviceClass + "'."); 
      } 
      // Get web service instance from the bean factory 
      Service service = (Service) beanFactory.getBean(serviceClass); 
      // Determine the name of the JAX-WS port 
      QName portName = new QName(service.getServiceName().getNamespaceURI(), findPortLocalName(serviceClass, field.getType())); 
      // Obtain the JAX-WS port 
      Object port = service.getPort(portName, field.getType()); 
      // Inject the port into the target bean 
      ReflectionUtils.makeAccessible(field); 
      ReflectionUtils.setField(field, bean, port); 
     } 
    }); 
    return bean; 
}