В чем проблема с не использованием Spring - PullRequest
3 голосов
/ 22 апреля 2009

Я пытаюсь понять весну. Я прочитал об этом и сделал несколько уроков. Я как бы понимаю парадигму IoC и тот факт, что DI является ее реализацией весной.

Мой вопрос таков: что вы теряете, не используя Spring? Я понимаю, что это большой вопрос и несколько субъективный. Но если бы вы могли написать несколько точек или привести пример проблемы, которая может возникнуть, если Spring не будет использоваться, я думаю, что это поможет мне и многим другим людям.

Ответы [ 7 ]

3 голосов
/ 22 апреля 2009

Spring - это гораздо больше, чем просто другой инструмент IoC (подумайте о материалах, связанных с DAO, удобной поддержке MVC, инструментах тестирования, ...). На мой взгляд, он постепенно вырос до своего рода «аромата» Java. Но не в этом суть :) Говоря о IoC / DI, то, что вы потеряете, не используя его, - это самый простой способ получить слабую связь в вашем приложении, что связано с возможностью повторного использования. Очевидно, что большинство людей склонны думать о возможности повторного использования компонента в другом проекте, что, по моему опыту, происходит не так часто. Наибольшее преимущество повторного использования появляется, когда вам приходится тестировать свой код. Программирование через интерфейс и с использованием DI / IoC делает юнит-тесты настолько простыми, что даже те, кто не хочет проводить модульный тест, начнут его любить.

Слабая связь и польза от UT - это одна вещь, которую вы потеряете.

2 голосов
/ 28 июля 2010

Проще говоря, вы применяете внедрение зависимостей для написания чистого и тестируемого кода. Кроме того, вы получаете дизайн, в котором вызывающая сторона знает, какую реализацию использовать (внедрить), а не вызываемую (это то, что известно как «принцип Голливуда»). Теперь, если вы не используете DI-фреймворки, такие как Spring и Guice, вы пытаетесь добиться внедрения зависимостей с помощью фабрик. Но фабрики идут со стоимостью стандартного кода и нелегкой очистки во время тестирования. Некоторые люди также находят другие сильные стороны в этих платформах, которые заключаются в их легкой интеграции с платформами, принадлежащими к различным уровням, таким как Struts, Hibernate и так далее.

2 голосов
/ 19 января 2010

Я написал, почему люди используют каркасы внедрения зависимостей (такие как Spring и Google Guice). В большинстве уроков этим пренебрегают, но ИМХО это самое главное.

Если вы понимаете проблему, с которой сталкиваетесь, и какие проблемы решают все эти шаблоны / структуры, только тогда вы сможете сделать хорошее программное обеспечение и сделать отличный архитектурный выбор.

Читайте об этом здесь: http://www.redcode.nl/blog/2010/01/dependency-injection-dissection

2 голосов
/ 22 апреля 2009

На самом деле проблем нет. Но если вы начнете писать свой код, вы получите доморощенный фреймворк, очень похожий на Spring. С помощью Spring вы получаете то, что фреймворк уже более универсален (чем ваш), и вы можете использовать его во многих различных проектах. И самое важное (может быть), что Spring хорошо протестирован с таким количеством пользователей, которые его используют.

Конечно, вы можете попробовать и другой фреймворк, а не только Spring. Там много всего ...

1 голос
/ 22 апреля 2009

Spring - это гораздо больше, чем DI-фреймворк. Есть много областей, которые облегчат вам программирование:

  • JDBC, Hibernate, JMS шаблоны (значительно сокращают количество строк кода)
  • Аспект программирования
  • Безопасность (Spring security)
  • Пружина MVC
  • Spring Web Services

Это только некоторые примеры - их гораздо больше. Вам не нужно использовать ничего из вышеперечисленного, но все это является частью хорошо продуманной, хорошо разработанной среды, и в целом они упрощают работу.

Ядром Spring является, конечно же, Dependency Injection. Преимущества использования структуры DI могут быть неочевидны для небольших проектов, но они очевидны для крупных и сложных проектов. Мартин Фаулер объясняет инверсию контроля очень четко. Конечно, есть и другие альтернативы (например, Guice), но я бы сказал, что Spring теперь является отраслевым стандартом.

1 голос
/ 22 апреля 2009

Гениальный ответ: вам придется все это кодировать самостоятельно. Я не знаю много о Spring (пока), но даже базовый акт внедрения конструктора потребует большого количества кода, тогда как в Spring вам нужны две точки редактирования:

В конфигурации:

  <sectionGroup name="spring">
    <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
  </sectionGroup>

  <spring>
    <context>
      <resource uri="config://spring/objects"/>
    </context>
    <objects xmlns="http://www.springframework.net">
      <object name="mediaLibrary" type="AlbumLibraryWPF.AlbumLibrary, AlbumLibrary"/>
    </objects>
  </spring>

В коде:

  IApplicationContext ctx = ContextRegistry.GetContext();
  library = (Library)ctx.GetObject("mediaLibrary");

Что бы вы предпочли сделать: написать DI-фреймворк самостоятельно или сосредоточиться на создании своего решения?

0 голосов
/ 22 апреля 2009

IoC - это, в основном, хорошая вещь в языке Java, потому что, когда большинство приложений начинают расти, и вы не разрабатываете для модульности / слабой связи, вы получаете большую кучу взаимосвязанных классов без каких-либо разумных границ.

Для начала, Spring и другие IoC / DI-структуры заставляют задуматься о модульности с самого начала. Это очень важно, потому что если ваш код хорошо модульный / слабосвязанный, вы в конечном итоге создаете компоненты и многократно используете их, что приводит к улучшению модульного тестирования (если вы все равно проводите модульное тестирование).

Если я хочу написать DAO, я могу заранее определить его интерфейс:

interface IPersonDao {
  List<Person> getPersonsByTeam(String teamName);
}

тогда я могу просто призвать к реализации этого интерфейса из любого места в src, где "применяется" Spring. Предположим, мне это нужно на уровне сервиса:

class MyService {
  @Autowired
  IPersonDao svc;
}

или в тестовом классе:

class TestPersonDao {
  @Autowired
  IPersonDao svc;

   @Test
  void testGetPersons(){
    List<Person> persons = svc.getPersonsByTeam("billing");
    Assert.assertDataSet(persons, "billing.xml");
  }
}

Кроме того, моя реализация Dao может скрыть сложности доступа к данным, не вмешиваясь в контракт Dao. Если мне требуется сеанс гибернации или диспетчер персистентности, я просто заявляю, что:

class JpaPersonDao implements IPersonDao {

@PersistenceContext
EntityManager em;

  List<Person> getPersonsByTeam(String tm) {
    em.createQuery("...");
  }
}

Компонентация классов требует реестра для связи сотрудничающих bean-компонентов. Это может быть разработано вручную, но уже есть структуры DI, которые делают это. Кроме того, у Spring есть много других вещей, таких как трансляция исключений, поддержка аспектного программирования, фреймворки mvc, фреймворки портлетов, интеграция с hibernate, jpa и / или другими стеками БД, которые, конечно, хорошо интегрируются с Spring IoC.

...