2013-06-03 2 views
2

У меня есть пользовательская аннотация, объявленная как Spring Managed Service:Выключите автоматическое связывание для Spring @Service

@Service 
public @interface MyServiceAnnotation { 
    // my service url 
    String url(); 
} 

The above declaration enables my services to be autowired as Spring Managed beans. 
@MyServiceAnnotation(url="/path/serviceLocation") 
public class SomeService { 
    doWork(); 
} 

Однако, есть определенные услуги, которые имеют свои определения боба в качестве applicationContext.xml. Добавление @MyServiceAnnotation к таким фасолям делает их включенными как Autowiring, так и встраивает dependecy через XML-файл.

Из-за проблем, связанных с устаревшим кодом, я не хочу удалять определения xml bean и делать их все автоматически.

Итак, есть ли способ, в котором я мог бы отключить автопогрузку в этом случае, и все еще использовать @MyServiceAnnotation? В идеале я хотел бы иметь аннотацию @Service на MyServiceAnnotation, существующие службы по-прежнему будут использовать @MyServiceAnnotation, но получат их зависимости, введенные на основе xml. Все новые службы будут автоматически отключены без определений компонентов xml.

Одним из возможных подходов является создание NonSpringManagedMyServiceAnnotation, что и у MyServiceAnnotation, но без аннотации @Service. Недостатком этого является то, что мне придется дублировать остальную часть кода от MyServiceAnnotation, чего я не хочу.

+2

Вы вводите в заблуждение две разные темы - ** autowiring ** не имеет никакого отношения к вашему вопросу. То, что вы хотите, - это запретить ** регистрацию ** bean definition **, выполняемую ** компонентом scan **. –

+0

Мой вопрос состоял в том, чтобы сохранить определение бина и подавить проверку компонентов в одном сценарии и сохранить проверку компонентов в другом ... Фильтр исключений, по-видимому, является разумным решением в этом случае. – user841717

ответ

3

Это один из подходов, возможно, не такой оптимальный. Я предполагаю, что вы указали бы тэг component-scan в вашем xml для сканирования классов с аннотациями стереотипов Spring, эти теги поддерживают подтег exclude-filter, чтобы игнорировать определенные шаблоны. Если указанные вами файлы соответствуют определенному шаблону (конкретные пакеты, конкретные имена и т. Д.), Вы можете просто указать этот подтег для игнорирования классов, содержащих аннотацию.

<context:component-scan base-package="mypackage"> 
    <context:exclude-filter type="regex" expression=".*ToBeIgnoredNaming"/> 
</context:component-scan> 
0

Я думаю, вы должны попытаться сохранить разделение беспокойства.

Добавление @Service в вашу аннотацию делает его де-факто службой Spring: поскольку это не то поведение, которое вы хотите, вы можете просто иметь простой @MyAnnotation (с свойством url) для каждой службы (устаревший и новый). Затем вы добавляете аннотацию Spring @Service на каждую новую услугу, чтобы включить регистрацию бонов по аннотации.

+0

Пожалуйста, не смешивайте * autowiring * и * регистрацию бонуса * (через компонентное сканирование), такие как OP. –

+0

Переписывание сообщения без полного чтения - настоящий позор ... Спасибо за комментарий. Исправлено, чтобы избежать путаницы. –

Смежные вопросы