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
Ответ 3
Также проверьте эту ссылку. Это немного более специфично (для веб-приложения), но у него есть очень хороший пример кода для сканирования, в частности: http://static.springsource.org/spring/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/EnableWebMvc.html
из этой ссылки:
@ComponentScan(basePackages = { "org.example"} )