Для чего предназначена Spring Framework?

Я много слышал о Spring, люди по всему миру говорят, что Spring - хорошая основа для веб-разработки. Для чего конкретно Spring Framework?

+562
источник поделиться
17 ответов

По сути, Spring - это фреймворк для , который представляет собой паттерн, позволяющий создавать очень несвязанные системы.

Эта проблема

Например, предположим, что вам нужно перечислить пользователей системы и, таким образом, объявить интерфейс с именем UserLister:

public interface UserLister {
    List<User> getUsers();
}

И, возможно, реализация доступа к базе данных для получения всех пользователей:

public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

По вашему мнению, вам нужно получить доступ к экземпляру (просто пример, помните):

public class SomeView {
    private UserLister userLister;

    public void render() {
        List<User> users = userLister.getUsers();
        view.render(users);
    }
}

Обратите внимание, что приведенный выше код не инициализировал переменную userLister. Что нам делать? Если я явно создаю экземпляр объекта следующим образом:

UserLister userLister = new UserListerDB();

... Я бы связал представление с моей реализацией класса, который обращается к БД. Что если я захочу перейти от реализации БД к другой, которая получает список пользователей из файла, разделенного запятыми (помните, это пример)? В этом случае я бы снова пошел к своему коду и изменил последнюю строку:

UserLister userLister = new UserListerCommaSeparatedFile();

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

Подход Spring (Dependency Injection)

Что делает Spring, так это связывает классы с помощью XML файла или аннотаций, таким образом все объекты создаются и инициализируются Spring и внедряются в нужных местах (сервлеты, веб-фреймворки, бизнес-классы, DAO и т.д. И т.д. И т.д. И т.д. И т.д....).

Возвращаясь к примеру в Spring, нам просто нужно иметь установщик для поля userLister и иметь либо XML файл, подобный этому:

<bean id="userLister" class="UserListerDB" />

<bean class="SomeView">
    <property name="userLister" ref="userLister" />
</bean>

или, более просто, аннотируйте поле в нашем классе представления с помощью @Inject:

@Inject
private UserLister userLister;

Таким образом, когда представление создается, оно волшебным образом будет иметь готовый к работе пользовательский UserLister.

List<User> users = userLister.getUsers();  // This will actually work
                                           // without adding any line of code

Это просто супер! Не так ли?

  • Что, если вы хотите использовать другую реализацию вашего интерфейса UserLister? Просто измените XML
  • Что, если у вас нет UserLister реализации UserLister? Запрограммируйте временную реализацию UserLister и упростите разработку представления.
  • Что если я больше не хочу использовать Spring? Только не используйте это! Ваше приложение не связано с ним. Инверсия управления гласит: "Приложение контролирует структуру, а не среда контролирует приложение".

Есть несколько других вариантов внедрения зависимостей, что, на мой взгляд, сделало Spring настолько известным, кроме его простоты, элегантности и стабильности, что ребята из SpringSource запрограммировали множество POJO, которые помогают интегрировать Spring со многими другими общими фреймворками без навязчиво в вашем приложении. Кроме того, у Spring есть несколько хороших подпроектов, таких как Spring MVC, Spring WebFlow, Spring Security и еще раз огромный список и так далее.

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

+646
источник

Spring содержит (как справедливо указал Скаффман) структуру MVC. Короче говоря, это мои входы. Spring поддерживает разделение уровня обслуживания, веб-уровня и бизнес-уровня, но то, что он действительно делает лучше всего, - это "инъекция" объектов. Итак, чтобы объяснить, что в примере рассмотрим пример ниже:

public interface FourWheel
{
   public void drive();
}

public class Sedan implements FourWheel
{
   public void drive()
   {
      //drive gracefully
   }
}

public class SUV implements FourWheel
{
   public void drive()
   {
      //Rule the rough terrain
   }
}

Теперь в вашем коде у вас есть класс под названием RoadTrip следующим образом

public class RoadTrip
{
    private FourWheel myCarForTrip;
}

Теперь, когда вам нужен экземпляр Trip; иногда вам может понадобиться SUV для инициализации FourWheel, или иногда вам может понадобиться Sedan. На самом деле это зависит от конкретной ситуации.

Чтобы решить эту проблему, вы хотите, чтобы шаблон Factory был создан как шаблон создания. Где Factory возвращает правильный экземпляр. Таким образом, в конечном итоге вы получите много кода клея только для правильного создания объектов. Spring делает работу с кодом клея лучше без этого кода клея. Вы объявляете сопоставления в XML и автоматически инициализировали объекты. Он также много делает с использованием архитектуры singleton для экземпляров и помогает оптимизировать использование памяти.

Это также называется Inversion Of Control. Другие рамки для этого - Google guice, контейнер Pico и т.д.

Кроме того, Spring имеет структуру проверки, обширную поддержку уровня DAO в сотрудничестве с JDBC, iBatis и Hibernate (и многие другие). Обеспечивает превосходный Транзакционный контроль над транзакциями базы данных.

Есть намного больше, чем Spring, которые можно прочитать в хороших книгах, таких как "Pro Spring".

Следующие URL-адреса могут также помочь.
http://static.springframework.org/docs/Spring-MVC-step-by-step/
http://en.wikipedia.org/wiki/Spring_Framework
http://www.theserverside.com/tt/articles/article.tss?l=SpringFramework

+57
источник

В прежние времена Spring был фреймом зависимостей, работающим только как (Guice, PicoContainer ,...), но сейчас дни - это комплексные решения для создания корпоративного приложения.

Весенняя инъекция зависимости, которая, конечно, является сердцем весны, все еще здесь (и вы можете просмотреть другие хорошие ответы здесь), но есть и другие из весны....

В Spring сейчас есть много проектов, каждый из которых имеет несколько подпроектов (http://spring.io/projects). Когда кто-то говорит о весне, вы должны выяснить, о каком весеннем проекте он говорит, это только пружинное ядро, известное как пружинный каркас, или это другие весенние проекты.

Некоторые весенние проекты, о которых стоит упомянуть:

Если вам нужна еще какая-то особенность для вашего приложения, вы можете найти ее и там:

  • Пакетная среда Spring Batch, предназначенная для разработки
    пакетное приложение
  • Spring HATEOAS легкое создание базы REST API на основе принципала HATEOAS
  • Spring Mobile и Spring Andriod для разработки мобильных приложений
  • Spring Shell создает полнофункциональное приложение оболочки (или командную строку)
  • Spring Cloud и Spring Cloud Data Flow для облачных приложений

Там также есть несколько крошечных проектов, например, spring-social-facebook (http://projects.spring.io/spring-social-facebook/)

Вы можете использовать Spring MVC для веб-разработки, так как он имеет модуль Spring MVC который является частью проекта Spring Framework. Или вы можете использовать пружину с другим каркасом, например struts2.

+33
источник

Что такое Spring для? Я отвечу на этот вопрос в ближайшее время, но сначала, давайте еще раз взглянем на пример победителем hugo. Это не отличный пример, потому что это не оправдывает необходимость в новой структуре.

public class BaseView {
  protected UserLister userLister;

  public BaseView() {
    userLister = new UserListerDB(); // only line of code that needs changing
  }
}

public class SomeView extends BaseView {
  public SomeView() {
    super();
  }

  public void render() {
    List<User> users = userLister.getUsers();
    view.render(users);
  }
}

Готово! Итак, даже если у вас есть сотни или тысячи просмотров, вам все равно нужно изменить одну строку кода, как в XML-подходе Spring. Но изменение строки кода по-прежнему требует перекомпиляции в отличие от редактирования XML, который вы говорите? Хорошо, мой суетливый друг, используйте Ant и script прочь!

Итак, что такое Spring для? Это для:

  • Слепые разработчики, которые следуют за стадом
  • Работодатели, которые никогда не хотят нанимать выпускников-программистов, потому что они не учат таким структурам в Uni
  • Проекты, которые начались с плохого дизайна и нуждаются в лоскутной одежде (как показано примером победителя hugo)

Дополнительная литература: http://discuss.joelonsoftware.com/?joel.3.219431.12

+25
источник

Короче говоря, я скажу, что Spring - это "клей" в вашем приложении. Он использовался для интеграции различных фреймворков и собственного кода.

+18
источник

Spring - это три вещи.

  • Spring обрабатывает инъекцию зависимостей, и я рекомендую вам прочитать превосходное введение Мартина Фаулера по инъекции зависимостей.
  • Во-вторых, Spring делает отличные Java-библиотеки очень элегантным способом использования в ваших приложениях. Для хорошего примера см., Как Spring обертывает исполнителей задач и планировщик кварцевых ключей.
  • В-третьих Spring предоставляет кучу реализаций веб-материалов, таких как REST, веб-фреймворк MVC и многое другое. Они фигурируют с тех пор, как вы используете Spring для первых двух, возможно, вы можете просто использовать его для всего, что требуется вашему веб-приложению.

Проблема в том, что Spring DI действительно хорошо продуман, обертки вокруг других вещей действительно хорошо продуманы, потому что другие вещи все продумали и Spring просто красиво обертывает его. Реализации Spring MVC и REST и всех других вещей не так хорошо сделаны (YMMV, IMHO), но есть исключения (Spring Security - da bomb). Итак, я предпочитаю использовать Spring для DI и его классные обертки, но предпочитаю другие вещи для Web (мне очень нравится Tapestry), REST (Джерси действительно надежный) и т.д.

+13
источник

Что вы, возможно, захотите в веб-приложении с Spring -

  • Spring MVC, который с 2.5+ позволяет использовать POJO в качестве классов контроллера, что означает, что вам не нужно распространяться из какой-либо конкретной структуры (как в Struts или Spring pre-2.5). Классы контроллеров также очень просты в тестировании, отчасти благодаря внедрению зависимостей
  • Spring интеграция с Hibernate, что делает хорошую работу по упрощению работы с этим решением ORM (для большинства случаев)
  • Использование Spring для веб-приложения позволяет использовать объекты домена на всех уровнях приложения - те же классы, которые сопоставляются с использованием Hibernate, - это классы, которые вы используете как "форма beans". По своей природе это приведет к созданию более надежной модели домена, отчасти потому, что она сократит количество классов.
  • Spring Теги формы облегчают создание форм без особых проблем.

Кроме того, Spring является ОГРОМНЫМ - поэтому есть много других вещей, которые могут быть заинтересованы в использовании в веб-приложении, таком как Spring AOP или Spring Безопасность. Но перечисленные выше четыре описывают общие компоненты Spring, которые используются в веб-приложении.

+11
источник

Я вижу две части:

  • "Что такое Spring для" → см. принятый ответ победителем hugo.
  • "[...] Spring является [хорошей] основой для веб-разработки" → люди говорят, что речь идет о Spring MVC. Spring MVC является одной из многих частей Spring и представляет собой веб-фреймворк, использующий общие функции Spring, такие как инъекция зависимостей. Это довольно универсальная структура, поскольку она очень настраивается: вы можете использовать разные уровни db (Hibernate, iBatis, plain JDBC), разные уровни представления (JSP, Velocity, Freemarker...)

Обратите внимание, что вы можете отлично использовать Spring в веб-приложении без использования Spring MVC. Я бы сказал, что большинство веб-приложений Java делают это, используя другие веб-фреймворки, такие как Wicket, Struts, Seam,...

+8
источник

Spring отлично подходит для склеивания экземпляров классов. Вы знаете, что вашим классам Hibernate всегда нужен источник данных, Spring соединяет их вместе (и также имеет реализацию источника данных).

Ваши объекты доступа к данным всегда будут иметь доступ к Hibernate, Spring прокладывает классы Hibernate в ваши DAO для вас.

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

Spring - действительно отличный инструмент. (Я не говорил о Spring MVC, просто базовый фреймворк).

+7
источник

Принятый ответ не включает использование аннотаций, так как Spring представил поддержку различных аннотаций для конфигурации.

Подход Spring (Dependency Injection)

Есть еще один способ связать классы вместе с использованием файла XML: аннотации. Давайте использовать пример из принятого ответа и зарегистрировать компонент непосредственно в классе, используя одну из аннотаций @Component, @Service, @Repository или @Configuration:

@Component
public class UserListerDB implements UserLister {
    public List<User> getUsers() {
        // DB access code here
    }
}

Таким образом, когда представление создается, оно волшебным образом будет иметь готовый к работе пользовательский список.

Вышеприведенное утверждение действительно с небольшим бонусом: нет необходимости использовать какой-либо XML файл и использовать другую аннотацию @Autowired которая находит соответствующую реализацию и внедряет ее.

@Autowired
private UserLister userLister;

Используйте аннотацию @Bean для метода, используемого для внедрения реализации bean-компонента.

+5
источник

Преимущество Injection Dependency (DI). Это означает аутсорсинг задачи создания объекта. Позвольте мне объяснить пример.

public interface Lunch
{
   public void eat();
}

public class Buffet implements Lunch
{
   public void eat()
   {
      // Eat as much as you can 
   }
}

public class Plated implements Lunch
{
   public void eat()
   {
      // Eat a limited portion
   }
}

Теперь в моем коде у меня есть класс LunchDecide следующим образом:

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(){
        this.todaysLunch = new Buffet(); // choose Buffet -> eat as much as you want
        //this.todaysLunch = new Plated(); // choose Plated -> eat a limited portion 
    }
}

В вышеуказанном классе, в зависимости от нашего настроения, мы выбираем Buffet() или Plated(). Однако эта система тесно связана. Каждый раз, когда нам нужен другой тип объекта, нам нужно изменить код. В этом случае, комментируя строку! Представьте, что 50 разных классов используются 50 разными людьми. Это было бы ужасно. В этом случае нам нужно разделить систему. Позвольте переписать класс LunchDecide.

public class LunchDecide {
    private Lunch todaysLunch;
    public LunchDecide(Lunch todaysLunch){
        this.todaysLunch = todaysLunch
        }
    }

Обратите внимание, что вместо создания объекта с использованием нового ключевого слова мы передали ссылку на объект Lunch Type в качестве параметра нашему конструктору. Здесь создание объекта передается на аутсорсинг. Этот код можно подключить либо с помощью файла конфигурации Xml (legacy), либо с помощью Java Annotations (современный). В любом случае решение о том, какой тип объекта будет создан, будет выполняться там во время выполнения. Объект будет вводиться Xml в наш код. Наш код зависит от Xml для этого задания. Следовательно, инъекция зависимостей (DI). DI помогает не только в том, чтобы сделать нашу систему непринужденно связанной, она упрощает запись модульных тестов, так как позволяет замалчивать зависимости. И последнее, но не менее важное: DI упрощает аспектно-ориентированное программирование (АОП), что приводит к дальнейшему развязыванию и увеличению модульности. Также обратите внимание, что выше DI является инжектором конструктора. DI также может выполняться с помощью Setter Injection - такой же простой старый метод установки из инкапсуляции.

+4
источник

Spring является хорошей альтернативой технологии Enterprise JavaBeans (EJB). Он также имеет инфраструктуру веб-инфраструктуры и веб-сервисов.

+3
источник
  • Spring - это легкий и гибкий каркас по сравнению с J2EE.
  • Пружинный контейнер действует как инверсия контроля.
  • Spring использует AOP, т.е. прокси и шаблоны Singleton, Factory и Template Method Design.
  • Многоуровневая архитектура: разделение задач и многоразовых слоев и простота обслуживания.

enter image description here

+2
источник

Spring начался как довольно простая система впрыскивания зависимостей. Теперь он огромен и имеет все в нем (кроме пресловутой кухонной раковины).

Но не бойся, он довольно модульный, поэтому вы можете использовать только те части, которые вы хотите.

Чтобы узнать, где все это началось, попробуйте:

http://www.amazon.com/Expert-One-Design-Development-Programmer/dp/0764543857/ref=sr_1_1?ie=UTF8& s = books & qid = 1246374863 & sr = 1-1

Возможно, он старый, но это отличная книга.

Для другой хорошей книги, на этот раз исключительно посвященной Spring, см.:

http://www.amazon.com/Professional-Java-Development- Spring -Framework/dp/0764574833/ref = sr_1_2? ie = UTF8 & S = & книги амп; QID = 1246374863 & ср = 1-2

Он также ссылается на более старые версии Spring, но определенно стоит посмотреть.

+1
источник

Spring - это инъекция зависимостей в начале, затем добавьте король оберток почти для всех (оболочка над реализациями JPA и т.д.).

Длинная история... большинство частей Spring preffer XML-решений (XML-скриптовый движок... brrrr), поэтому для DI я использую Guice

Хорошая библиотека, но с растущим depnedenciec, например Spring JDBC (возможно, одно решение Java jdbc с реальными параметрами имен) берут с maven 4-5 next.

Использование Spring MVC (часть "большой spring" ) для веб-разработки... это "основанная на запросе" структура, есть священная война "запрос против компонента"... до вас

+1
источник

Spring Framework явно хорош для веб-разработки, более специфичной для Rest api. Это из-за этого внедрение зависимости и интеграция с другими модулями, такими как Spring Security, Spring AOP, MVC Framework, микросервисы

Любое приложение, которое вы создаете, обязательно нуждается в безопасности.
Если вы создаете продукт, требующий длительного обслуживания, вам непременно понадобится концепция Aop.

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

Spring дает все это на одной платформе. Поддержка многих модулей
Главное, что Spring - это открытый исходный код и расширяемый фреймворк, везде есть крючок для интеграции пользовательского кода в жизненный цикл.

Spring Data - это один проект, который обеспечивает интеграцию с вашим проектом.


Так что все, что вам нужно для создания приложения, имеет Spring.

0
источник

В прошлом я думал о Spring Framework с чисто технической точки зрения.

Учитывая некоторый опыт командной работы и разработки корпоративных веб-приложений - я бы сказал, что Spring предназначен для более быстрой разработки приложений (веб-приложений) путем ветки его отдельных элементов (компонентов). Более быстрое развитие делает его таким популярным. Spring позволяет переложить ответственность за сборку (подключение) приложения на среду Spring. Внедрение зависимостей в среду Spring отвечает за подключение/подключение отдельных bean-компонентов к работающему приложению.

Таким образом, разработчики могут сосредоточиться на разработке отдельных компонентов (компонентов), как только будут определены интерфейсы между компонентами.

Тестирование такого приложения легко - основное внимание уделяется отдельным компонентам. Их легко отсоединить и смоделировать, поэтому модульное тестирование будет быстрым и эффективным.

Платформа Spring определяет несколько специализированных bean-компонентов, таких как @Controller (@Restcontroller), @Repository, @Component, для обслуживания веб-целей. Spring вместе с Maven предоставляют структуру, интуитивно понятную для разработчиков. Командная работа проста и быстра, поскольку отдельные элементы хранятся отдельно и могут быть использованы повторно.

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос