Я не думаю, что можно изменить поведение @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;
}