При работе с устаревшим кодом вы не сможете за ночь превратить его в полноценное приложение Spring, что занимает много времени. То, что вам нужно сделать, это добавлять код Spring постепенно, по частям, и есть один хороший способ сделать это.
В следующем сценарии вы работаете над устаревшим кодом и написали bean-компонент Spring с именем MySpringBean, и ему нужно использовать устаревший класс: LegacyAppClass
Класс legacy выглядит так:
1
2
3
4
5
6
7
|
public class LegacyAppClass { // some old code goes here public void legacyDoSomethingMethod() { System.out.println( "This is so old it doesn't use a logger...." ); } } |
… Пока ваш новый SpringBean выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
public class MySpringBean { private LegacyAppClass injectedBean; @Override public String toString() { return "The toString()" ; } public LegacyAppClass getInjectedBean() { return injectedBean; } public void setInjectedBean(LegacyAppClass injectedBean) { this .injectedBean = injectedBean; } public void myDoSomethingMethod() { injectedBean.legacyDoSomethingMethod(); } } |
… Как видите, метод myDoSomethingMethod () должен вызывать устаревший метод legacyDoSomethingMethod ().
Принимая во внимание, что у любого унаследованного приложения будет свой собственный способ создания различных объектов, и что ваш новый код Spring должен будет использовать эти объекты, чтобы выполнить свою работу, тогда вам нужен способ комбинирования унаследованных объектов с вашими блестящими новыми. Обычно это включает добавление унаследованных объектов в ваш Spring-контекст и внедрение их в ваши объекты, а для этого вам необходим Spring- объект StaticApplicationContext .
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
@Test public void loadExternalClassTest2() { LegacyAppClass myInstance = new LegacyAppClass(); GenericApplicationContext parentContext = new StaticApplicationContext(); parentContext.getBeanFactory().registerSingleton( "injectedBean" , myInstance); parentContext.refresh(); // seems to be required sometimes ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "SpringIntegrationExample.xml" }, parentContext); MySpringBean mySpringBean = context.getBean(MySpringBean. class ); assertNotNull(mySpringBean); mySpringBean.myDoSomethingMethod(); System.out.println(mySpringBean.toString()); } |
В приведенном выше тестовом коде первое, на что следует обратить внимание, — это то, что я создаю экземпляр LegacyAppClass для использования тестом, но в реальном приложении он уже будет создан где-то в вашей базе кода. Следующие три строки — это место, где происходит волшебство …
1
2
3
4
5
|
GenericApplicationContext parentContext = new StaticApplicationContext(); parentContext.getBeanFactory().registerSingleton( "injectedBean" , myInstance); parentContext.refresh(); // seems to be required sometimes |
… В приведенном выше фрагменте вы можете видеть, что я создаю StaticApplicationContext, а затем прагматично добавляю в него мой экземпляр класса прежних версий.
1
2
|
ApplicationContext context = new ClassPathXmlApplicationContext( new String[] { "SpringIntegrationExample.xml" }, parentContext); |
Последняя задача, как показано выше, состоит в том, чтобы затем создать новый контекст приложения Spring, используя любой метод, подходящий для вашего проекта. В этом случае я использовал общеизвестный ClassPathXmlApplicationContext, но другие типы контекста приложения работают так же хорошо.
Вы можете сказать, что это простой пример Микки-Мауса, но по опыту он очень хорошо масштабируется. В настоящее время он используется несколькими полнофункциональными приложениями MVC JSP Front Strategy в старом стиле (подробно описанными в моем блоге в октябре прошлого года « Все знают о MVC» ), как часть реализации паттерна душителя Мартина Фаулера.
Наконец, в интересах полноты ниже приведена конфигурация XML для этого примера:
1
2
3
4
5
6
7
8
9
|
<? xml version = "1.0" encoding = "UTF-8" ?> xsi:schemaLocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" > < bean id = "mySpringBean" class = "miscillaneous.springintegration.MySpringBean" > < property name = "injectedBean" ref = "injectedBean" /> </ bean > </ beans > |
Ссылка: Интеграция Spring Into Legacy Applications от нашего партнера JCG Роджера Хьюза в блоге Captain Debug .