Статьи

Интеграция Spring в старые приложения

Одна из вещей, которую любят делать все разработчики Spring, — это вставить Spring в любое приложение, над которым они работают — это одно из моих винных удовольствий в жизни: вы видите какой-то код, думаете, что это мусор, потому что он содержит несколько хорошо известных анти-паттернов, а затем подумайте, как было бы здорово, если бы это приложение было приложением Spring.

При работе с устаревшим кодом вы не сможете за ночь превратить его в полноценное приложение 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"?>
   
 <bean id="mySpringBean" class="miscillaneous.springintegration.MySpringBean">
  <property name="injectedBean" ref="injectedBean"/>
 </bean>
</beans>

Ссылка: Интеграция Spring Into Legacy Applications от нашего партнера JCG Роджера Хьюза в блоге Captain Debug .