Как интегрировать старое приложение Struts с Spring 3.x
Мне было интересно, как и как предпочтительнее интегрировать приложение Struts 1.x с Spring 3.x, чтобы мы могли извлечь выгоду из IOC.
4 ответа
Используйте ContextLoaderPlugin и установите контроллер Struts для класса процессора " AutowiringRequestProcessor " следующим образом (в struts-config.xml):
<controller>
<set-property property="processorClass" value="org.springframework.web.struts.AutowiringRequestProcessor" />
</controller>
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
<set-property property="contextConfigLocation" value="/WEB-INF/config/action-servlet.xml"/>
</plug-in>
action-servlet.xml должен быть пустым контекстным файлом beans:
<beans></beans>
Добавьте следующий параметр init в ActionServlet в web.xml:
<init-param>
<param-name>autowire</param-name>
<param-value>byName</param-value>
</init-param>
Просто напишите обычные действия Struts и добавьте аннотацию "@Component" к каждому действию, чтобы Spring обнаруживала действия и создавала из них боб. AutowiringRequestProcessor найдет правильный компонент, соответствующий классу действий, определенному в вашем struts-config.xml.
Теперь также можно вводить другие bean-компоненты в класс Action с помощью @Autowired на setter.
Используйте ContextLoaderPlugIn. Устаревшая весной 3.0, но все же есть.
Я использовал его со Struts 1.x и Spring 2.5.x - он работал прекрасно. Такой интеграционный подход позволяет внедрять компоненты Spring непосредственно в действия Struts, что довольно просто и понятно.
Вы можете использовать интерфейс ApplicationContextAware, чтобы служебный класс имел доступ к ApplicationContext.
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext = null;
public static Object getSpringBean(String beanName) {
return applicationContext.getBean(beanName);
}
public void setApplicationContext(ApplicationContext appContext)
throws BeansException {
applicationContext = appContext;
}
}
Затем вы можете получить доступ к статическому методу из вашего класса Action.
public class MyAction extends LookupDispatchAction {
private MyService getMyService() {
return (MyService) SpringUtil.getSpringBean("myService");
}
}
Не самое элегантное решение, но оно работает.
Это не работает. ContextLoaderPlugin недоступен в ЛЮБОЙ версии Spring после Spring 2.x. Struts 1.x не совместим ни с одной версией Spring после 2.x. Невозможно настроить любую версию Spring после 2.x для использования Struts 1.x. Вам также необходимо понизить версию обновления Struts для Spring. Вероятно, было бы проще понизить версию Spring, если вы не используете спящую версию после 3.x.