Инъекция аннотированного боба в обычный боб - PullRequest
2 голосов
/ 17 июня 2010

AppContext.xml

<bean id="myBean" class="com.myapp.MyClass">
    <property ref="myService"/>
</bean>

MyService.java

@Service
public class MyService {
 ...
}

Это приведет к исключению, указывающему, что для свойства "myService" не найден компонент, который я понимаю, потому что онне может быть найден в файлах контекста, но я могу автоматически связать это поле с другими bean-компонентами, управляемыми весной, но мне нужно явно скомпоновать bean-компонент в моем контексте, потому что POJO не редактируется в рамках моего проекта.

Ответы [ 2 ]

3 голосов
/ 17 июня 2010

Предполагая, что вы уже используете сканирование пути к классам компонентов, вы можете дать явное имя компоненту, а не позволять Spring автоматически генерировать для вас имя:

@Service("myService")
public class MyService {
 ...
}

Я не проверял это, но я верю, что это так.


edit : После небольшого копания логика для определения имени компонента находится в AnnotationBeanNameGenerator.generateBeanName().:

public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
    if (definition instanceof AnnotatedBeanDefinition) {
        String beanName = determineBeanNameFromAnnotation((AnnotatedBeanDefinition) definition);
        if (StringUtils.hasText(beanName)) {
            // Explicit bean name found.
            return beanName;
        }
    }
    // Fallback: generate a unique default bean name.
    return buildDefaultBeanName(definition);
}

Другими словами, он пытается получить явное имя бина из аннотаций и, в случае неудачи, использует значение по умолчанию:

protected String buildDefaultBeanName(BeanDefinition definition) {
    String shortClassName = ClassUtils.getShortName(definition.getBeanClassName());
    return Introspector.decapitalize(shortClassName);
}

Так что да, для аннотированного класса с именем MyService автоматически сгенерированное имя компонента должно быть действительно myService, поэтому ваш код должен работать.

Из любопытства, что происходит, когда вы используете @Component вместо @Service?

1 голос
/ 17 июня 2010

Это должно работать, если у вас есть

<context:component-scan base-package="your.root.package" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...