Spring @Конфигурация и <контекст: компонент-сканирование/">

У меня есть сценарий настройка Spring Безопасность встроенного Jetty, который, похоже, несколько решен, если я использую JavaConfig для настройки сервера Jetty.

В результате, это похоже на JavaConfig, а не на XML, может быть лучшим вариантом для больших фрагментов проекта. Однако в пространствах имен XML есть некоторые тонкости, такие как <context:component-scan />, которые не доступны в настройках @Configuration.

Я обнаружил, что ApplicationContextAware соблюдается для классов @Configuration, поэтому возможно следующее:

@Configuration
public class FooConfig implements ApplicationContextAware {
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) {
        ((AnnotationConfigApplicationContext) applicationContext).scan("org.example");
    }
}

Альтернативой documented является то, что класс @Configuration использует аннотацию @ImportResource и вытягивает существующий XML файл:

@Configuration
@ImportResource("applicationContext-withComponentScan.xml")
public class BarConfig {}

Я предполагаю, что вопрос: "Является ли плохая форма злоупотреблять ApplicationContextAware таким образом, или это действительно не злоупотребление"? Что-то просто странно грязно относится к подходу, поэтому я не удивлюсь, если ребята из Spring так или иначе накрыли это, что я не заметил.

Для заинтересованного пользователя проблема связана с проверкой настройки Джерси с классами @Resource и @Provider, которые мне бы не нужно было вручную управлять записями в конфигурации класса/XML.

Ответы

Ответ 1

Является ли плохая форма злоупотреблять ApplicationContextAware таким образом, или это действительно не злоупотребление

Да, это плохая форма. Если вы собираетесь вручную извлекать вещи из контекста вручную, вы можете, в первую очередь, не беспокоиться об инъекции зависимостей.

Однако ваш второй вариант (@ImportResource("applicationContext-withComponentScan.xml")) является хорошим - это текущая лучшая практика, когда вы хотите использовать эти макросы XML в сочетании с конфигурацией в стиле аннотаций.

Третий вариант заключается в использовании текущей версии вехи Spring 3.1, которая добавляет способ делать все это в Java, используя @Feature. Это еще не готово к производству.

Ответ 2

Теперь, когда Spring 3.1 готов и вышел, вы можете безопасно использовать @ComponentScan, если находитесь на Spring 3.1. Это не только для Spring MVC как один из устаревших ответов. Вы можете использовать его следующим образом:

@Configuration
@ComponentScan({"com.foo.bar", "org.foo.bar"})
public class AppConfig{ /** config code */ }

Вот документация http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/context/annotation/ComponentScan.html