Когда мы недавно развернули второе весеннее приложение на том же Tomcat, у нас возникли проблемы с неожиданным взаимодействием.
Как это часто случается, это открыло очень большую банку червей относительно того, как я создавал свой весенний контекст.,Это НЕ приложение для весенней загрузки.
Нет недостатка в примерах использования инициализации Servlet 3.0 в Spring.Однако я не могу найти ни одного, который бы использовал профили Spring и инициализацию контекста на основе аннотации @Configuration.
После большой боли я остановился на этом:
AnnotationConfigWebApplicationContext rootApplicationContext = new AnnotationConfigWebApplicationContext();
String [] activeProfiles = {"root","oracle"};
rootApplicationContext.getEnvironment().setActiveProfiles(activeProfiles);
rootApplicationContext.scan("com.xxx.restserver.config");
// Create the dispatcher servlet's application context
AnnotationConfigWebApplicationContext dispatcherContext = new AnnotationConfigWebApplicationContext();
String[] dispatcherActiveProfiles = {"web"};
dispatcherContext.getEnvironment().setActiveProfiles(dispatcherActiveProfiles);
dispatcherContext.setParent(rootApplicationContext);
dispatcherContext.scan("com.xxx.restserver.config");
// Managed the lifecycle of the application context
servletContext.addListener(new ContextLoaderListener(rootApplicationContext));
// Register and map the dispatcher Servlet
ServletRegistration.Dynamic dispatcher =
servletContext.addServlet("Dispatcher", new DispatcherServlet(dispatcherContext));
dispatcher.setLoadOnStartup(1);
dispatcher.addMapping("/");
Единственная проблема заключается в том, что файлы корневого контекста @configuration "обрабатываются" дважды.Один раз при сканировании, а затем снова при создании экземпляра ContextLoaderListener.Я использую кавычки, потому что в первый раз происходит некоторая инициализация, но контекст не остается в пригодном для использования состоянии.
Я поиграл с context.refresh (), но это сильно ухудшило ситуацию.
Все это вызывает несколько странных проблем, особенно с EHCache в корневом контексте.В общем, я мог бы просто игнорировать это.Но, похоже, должен быть способ заставить Spring сканировать каждый контекст ровно один раз - и при этом поддерживать профили.Но у меня нет идей.