Я много слышал о Spring , люди по всему миру говорят, что Spring - хорошая основа для веб-разработки. Для чего конкретно Spring Framework?
Я много слышал о Spring , люди по всему миру говорят, что Spring - хорошая основа для веб-разработки. Для чего конкретно Spring Framework?
Ответы:
В основном весна является основой для внедрение зависимости это образец, который позволяет строить очень несвязанные системы.
Например, предположим, что вам нужно перечислить пользователей системы и, таким образом, объявить интерфейс с именем 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, так это связывает классы с помощью 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
и упростите разработку представления.Есть несколько других вариантов внедрения зависимостей, что, на мой взгляд, сделало Spring настолько известным, кроме своей простоты, элегантности и стабильности, что ребята из SpringSource запрограммировали множество POJO, которые помогают интегрировать Spring со многими другими общими фреймворками без навязчиво в вашем приложении. Кроме того, у Spring есть несколько хороших подпроектов, таких как Spring MVC, Spring WebFlow, Spring Security и, опять же, огромный список и так далее.
Надеюсь это поможет. В любом случае, я призываю вас прочитать статью Мартина Фаулера о внедрении зависимости и инверсии контроля, потому что он делает это лучше меня. После понимания основы взглянуть на Спринг документации , на мой взгляд, это будет использоваться , чтобы быть лучшей книгой Spring когда - либо.
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; иногда вам может понадобиться внедорожник для инициализации FourWheel, а иногда - седан. Это действительно зависит от того, что вы хотите, в зависимости от конкретной ситуации.
Чтобы решить эту проблему, вы должны иметь фабричный шаблон в качестве шаблона для создания. Где фабрика возвращает правильный экземпляр. Таким образом, в конечном итоге вы получите много связующего кода только для правильной реализации объектов. Spring лучше всего справляется с клеевым кодом без этого клеевого кода. Вы объявляете отображения в XML, и он автоматически инициализирует объекты. Он также много использует одноэлементную архитектуру для экземпляров, и это помогает оптимизировать использование памяти.
Это также называется инверсией контроля. Другие рамки для этого - 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? л = SpringFramework
В прежние времена Spring был фреймом зависимостей, работающим только как ( Guice , PicoContainer , ...), но в настоящее время это комплексное решение для создания вашего корпоративного приложения .
Инъекция весенней зависимости, которая, конечно, является сердцем весны, все еще там (и вы можете просмотреть другие хорошие ответы здесь), но есть и другие из весны ...
В Spring сейчас есть много проектов, каждый из которых имеет несколько подпроектов ( http://spring.io/projects ). Когда кто-то говорит о весне, вы должны выяснить, о каком весеннем проекте он говорит, это только пружинное ядро, известное как пружинный каркас , или это другие весенние проекты.
Некоторые весенние проекты, о которых стоит упомянуть:
Если вам нужна еще какая-то конкретная функция для вашего приложения, вы также можете найти ее там:
Там также есть несколько крошечных проектов, например, spring-social-facebook ( http://projects.spring.io/spring-social-facebook/ )
Вы можете использовать Spring для веб-разработки, так как он имеет Spring MVC
модуль, который является частью проекта Spring Framework . Или вы можете использовать Spring с другим веб-фреймворком, например struts2 .
Для чего нужна весна? Я отвечу на этот вопрос в ближайшее время, но сначала давайте еще раз посмотрим на пример Виктора Гюго. Это не хороший пример, потому что он не оправдывает необходимость в новой структуре.
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);
}
}
Выполнено! Так что теперь, даже если у вас есть сотни или тысячи представлений, вам все равно нужно просто изменить одну строку кода, как в подходе Spring XML. Но изменение строки кода по-прежнему требует перекомпиляции, в отличие от редактирования XML, говорите вы? Ну, мой суетливый друг, используйте муравья и сценарий прочь!
Так для чего весна? Это для:
Дополнительное чтение: http://discuss.joelonsoftware.com/?joel.3.219431.12
UserLister
), но что , если это необходимо несколько услуг, не разделяемых между различными BaseView
«s детьми? К счастью, в Java нет множественного наследования.
Весна это три вещи.
Проблема в том, что Spring DI действительно хорошо продуман, обертки вокруг других вещей действительно хорошо продуманы в том, что другие вещи продумали все, и Spring просто оборачивает это. Реализация Spring в MVC и REST и все остальное не так хорошо сделано (YMMV, IMHO), но есть исключения (Spring Security - это бомба). Поэтому я склонен использовать Spring для DI и его классные обертки, но предпочитаю другие вещи для Web (мне очень нравится Tapestry), REST (Джерси действительно крепкий) и т. Д.
Что вы, вероятно, хотели бы в веб-приложении с Spring -
Кроме того, Spring - ОГРОМНЫЙ - поэтому есть много других вещей, которые вы могли бы заинтересовать в веб-приложении, таких как Spring AOP или Spring Security. Но четыре вещи, перечисленные выше, описывают общие компоненты Spring, которые используются в веб-приложении.
Я вижу две части к этому:
Обратите внимание, что вы можете прекрасно использовать Spring в веб-приложении без Spring MVC. Я бы сказал, что большинство веб-приложений Java делают это, используя другие веб-фреймворки, такие как Wicket, Struts, Seam, ...
Весна отлично подходит для склейки экземпляров классов. Вы знаете, что ваши классы Hibernate всегда будут нуждаться в источнике данных, Spring связывает их вместе (и также имеет реализацию источника данных).
Ваши объекты доступа к данным всегда будут нуждаться в доступе Hibernate, Spring связывает классы Hibernate с вашими DAO для вас.
Кроме того, Spring в основном дает вам надежные конфигурации для множества библиотек, и в этом, дает вам рекомендации относительно того, какие библиотеки вам следует использовать.
Весна действительно отличный инструмент. (Я не говорил о Spring MVC, просто о базовых рамках).
Принятый ответ не включает использование аннотаций, так как Spring представил поддержку различных аннотаций для конфигурации.
Есть еще один способ связать классы вместе с использованием файла 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-компонента.
@Bean
аннотацию на уровне класса. Должно быть одно из @Component
, @Service
и @Repository
т. Д. Остальное правильно. Возможно, вам также следует указать, что автоматическое подключение интерфейса таким образом будет работать только в том случае, если в пути к классам имеется только 1 подходящий класс, подходящий для внедрения, в противном случае ошибка приложения Spring.
Преимущество - Dependency Injection (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
}
}
Обратите внимание, что вместо создания объекта с использованием нового ключевого слова мы передали ссылку на объект типа обеда в качестве параметра нашему конструктору. Здесь создание объекта передается на аутсорсинг. Этот код может быть связан либо с использованием файла конфигурации Xml (устаревший), либо с помощью аннотаций Java (современный). В любом случае решение о том, какой тип объекта будет создан, будет приниматься там во время выполнения. Xml может внедрить объект в наш код - наш код зависит от Xml для этой работы. Следовательно, Dependency Injection (DI). DI не только помогает сделать нашу систему слабо связанной, но и упрощает написание модульных тестов, поскольку позволяет имитировать зависимости. И последнее, но не менее важное: DI оптимизирует аспектно-ориентированное программирование (AOP), что приводит к дальнейшему разделению и повышению модульности. Также обратите внимание, что над DI находится Constructor Injection.
Spring Framework help you with several things like, don't reinvent the wheel. you can connect very easily with some database just using Spring Data, or create schedule tasks like CronJob or Windows Task. amazing !
Spring - хорошая альтернатива технологии Enterprise JavaBeans (EJB) . Он также имеет веб-фреймворк и компонент веб-сервисов.
Spring начинался как довольно простая система внедрения зависимостей. Теперь он огромен и в нем есть все (кроме общеизвестной раковины).
Но не бойтесь, он достаточно модульный, поэтому вы можете использовать только те части, которые вам нужны.
Чтобы увидеть, с чего все началось, попробуйте:
Это может быть старый, но это отличная книга.
Еще одна хорошая книга, посвященная весне, на этот раз:
Он также ссылается на более старые версии Spring, но определенно стоит посмотреть.
Spring был внедрением зависимостей в начале, затем добавил короля оберток для почти всего (обертки над реализациями JPA и т. Д.).
Длинная история ... большинство компонентов Spring преферрируют XML-решения (механизм сценариев XML ... brrrr), поэтому для DI я использую Guice
Хорошая библиотека, но с растущим depnedenciec, например Spring JDBC (может быть, одно решение Java jdbc с параметрами реальных имен), взятое из maven 4-5 далее.
Использование Spring MVC (часть "большой весны") для веб-разработки ... это "основанная на запросах" структура, есть священная война "запрос против компонента" ... до вас
В прошлом я думал о Spring Framework с чисто технической точки зрения.
Учитывая некоторый опыт командной работы и разработки корпоративных веб-приложений, я бы сказал, что Spring предназначен для более быстрой разработки приложений (веб-приложений) путем отделения его отдельных элементов (компонентов). Более быстрое развитие делает его таким популярным. Spring позволяет переложить ответственность за сборку (подключение) приложения на среду Spring. Инъекция зависимостей в среду Spring отвечает за соединение / подключение отдельных bean-компонентов в работающее приложение.
Таким образом, разработчики могут сосредоточиться на разработке отдельных компонентов (компонентов), как только будут определены интерфейсы между компонентами.
Тестирование такого приложения легко - основное внимание уделяется отдельным компонентам. Их легко отсоединить и смоделировать, поэтому модульное тестирование будет быстрым и эффективным.
Платформа Spring определяет несколько специализированных bean-компонентов, таких как @Controller ( @Restcontroller ), @Repository , @Component, для обслуживания веб-целей. Spring вместе с Maven обеспечивают интуитивно понятную для разработчиков структуру. Командная работа проста и быстра, так как отдельные элементы хранятся отдельно и могут быть использованы повторно.
Spring Framework, безусловно, хорош для веб-разработки и, более конкретно, для остальных API-сервисов.
Это хорошо для вышеупомянутого из-за его внедрения зависимости и интеграции с другими модулями, такими как Spring Security , Spring AOP , MVC Framework , микросервисы
В любом приложении безопасность, скорее всего, является требованием.
Если вы хотите создать продукт, требующий длительного обслуживания, вам потребуется концепция Aop.
Если в вашем приложении много трафика, что увеличивает нагрузку, вам необходимо использовать концепцию микросервисов.
Spring предоставляет все эти возможности на одной платформе. Поддержка со многими модулями .
Самое главное, что Spring - это открытый исходный код и расширяемая структура, везде есть хук для интеграции пользовательского кода в жизненный цикл.
Spring Data - это один проект, который обеспечивает интеграцию с вашим проектом.
Так что весна может вписаться практически в любое требование.