Spring boot и spring framework разница
There are many people who advised me to use Spring Boot instead of Spring to develop REST web services. I want to know what exactly the difference between the two is?
Spring Boot vs Spring MVC vs Spring — Как они сравниваются?
Spring, Spring Boot, Spring MVC, везде есть слово “spring”! Давайте пройдемся где и когда вы можете применять каждый из этих инструментов
В этой статье, вы увидите обзоры: Spring, Spring MVC, и Spring Boot, узнаете какие проблемы они решают, и где они лучше всего применимы. Самый важный в факт что вы узнаете, является тем что Spring, Spring MVC, и Spring Boot не конкурируют за одно и то же место. Они решают разные проблемы, и они решают их очень хорошо.
Что за основная проблема, которую этот Spring Framework решает?
Долго и упорно подумайте. Какова проблема, решаемая Spring Framework?
Почему это важно? Потому что, когда DI или IOC правильно используются, мы можем разрабатывать слабо связанные приложения. А слабо связанные приложения могут быть легко протестированы юнит-тестами.
Давайте рассмотрим простой пример.
Пример без внедрения зависимостей
Эта строка создает экземпляр данного сервиса. А это значит что они сильно связаны. Например, если я создаю мок для WelcomeService в юнит-тесте для WelcomeController, как мне заставить WelcomeController использовать мок? Не легко!
Простой пример с внедрением зависимостей
Мир выглядит намного проще с внедрением зависимостей. Вы позволяете Spring Framework делать тяжелую работу. Мы просто используем две простые аннотации: Component и Autowired.
- Используя Component, мы говорим Spring Framework: Эй там, это бин, которым тебе нужно управлять.
- Используя Autowired, мы говорим Spring Framework: Эй, найди правильное совпадение для этого конкретного типа и подключи его.
В юнит-тесте, я могу попросить Spring framework подключить мок для WelcomeService к WelcomeController. (Spring Boot делает вещи проще делая это с аннотацией @MockBean. Но это уже совсем другая история!)
Что еще решает Spring Framework?
Проблема 1: Дублирование/Загрязнение кода
Останавливается ли Spring Framework с внедрением зависимостей? Нет. Он строится на основной концепции внедрения зависимостей с несколькими модулями Spring
- Spring JDBC
- Spring MVC
- Spring AOP
- Spring ORM
- Spring JMS
- Spring Test
Приносят ли эти модули новую функциональность? Нет. Мы можем делать все это на J2EE или Java EE. Так, что они приносят? Они приносят простые абстракции. Целью этих абстракций является:
- Уменьшить Boilerplate код/Уменьшить дублирование
- Способствовать разъединению/Расширить тестируемость
Проблема 2: хорошее интегрирование с другими фреймворками
Отличная вещь насчет Spring Framework, это то, что он не пытается решать проблемы которые уже решены. Все что он делает, это предоставляет отличную интеграцию с другими фреймворками, которые в свою очередь предоставляют отличные решения.
- Hibernate для ORM
- iBatis для Object Mapping
- JUnit и Mockito для юнит-тестирования
Почему нам нужен Spring Boot?
У приложений, основанных на Spring, много конфигураций.
Когда мы используем Spring MVC, нам необходимо сконфигурировать: component scan, dispatcher servlet, view resolver, web jars(для доставки статического контента) среди других вещей.
Код ниже показывает типичную конфигурацию dispatcher servlet в web приложении.
Когда мы используем Hibernate/JPA, нам надо сконфигурировать источник данных, фабрику менеджера сущностей, менеджер транзакций, и другие штуки.
Проблема 1: Spring Boot авто конфигурация: Можем ли мы думать иначе?
Spring Boot приносит новый мыслительный процесс вокруг всего этого.
- Что насчет авто конфигурации источника данных если jar-файл Hibernate есть в classpath?
- Что насчет авто конфигурации a Dispatcher Servlet если Spring MVC jar есть в classpath?
Проблема 2: Spring Boot Starter Projects: Построен вокруг хорошо известных паттернов
Давайте скажем что хотим разработать веб приложение.
Прежде всего нам потребуется определить фреймворки, которые хотим использовать, какие версии использовать и как их вместе подсоединить.
У всех веб приложений аналогичные потребности. Ниже перечислены зависимости которые используются в Spring MVC. Они включают в себя Spring MVC, Jackson Databind, Hibernate-Validator и Log4j.
Если вы хотите разрабатывать веб приложение или приложение для RESTful сервисов, ваш выбор — Spring Boot Start Web. Давайте быстро создадим проект с Spring Boot Starter Web используя Spring Initializr.
Зависимости для Spring Boot Starter Web
Следующий скриншот показывает разные зависимости, которые были добавлены в наше приложение.
Зависимости могут быть классифицированы на:
- Spring: core, beans, context, aop
- Web MVC: (Spring MVC)
- Jackson: для JSON связи
- Валидация: Hibernate Validator, Validation API
- Embedded Servlet Container: Tomcat
- Логирование: logback, slf4j
Параметры проекта Spring Boot Starter
Как мы видим из Spring Boot Starter Web, стартовые проекты помогают нам быстро начать разработку определенных типов приложений.
За последние несколько лет, из-за наращивания дополнительной функциональности, структура фреймворка Spring стала заметно сложнее. Теперь, чтобы начать новый Spring-проект, требуется длительная процедура подготовки, связанная с его настройкой. Чтобы сэкономить время и избежать конфигурирования данного фреймворка каждый раз с нуля, был придуман Spring Boot. Он использует Spring, как основу для своей работы.
В этой статье мы сосредоточимся на роли Spring и Spring Boot в решении различных проблем, а также посмотрим, чем они отличаются друг от друга. Давайте начнем!
Spring — один из наиболее широко используемых фреймворков для разработки интерпрайз-приложений, обеспечивающий продуманную модель программирования и конфигурации. Целью создания данного фреймворка способствовало желание упростить разработку приложений на популярном в то время (да и сейчас) Java EE стеке технологий от компании Oracle, который на тот момент был очень сложен и не всегда удобен в использовании.
В отличие от других платформ, Spring фокусируется на нескольких областях функционирования приложений и предоставляет для них широкий спектр дополнительных функций.
Одной из основных особенностей Spring Framework является использование паттерна Dependency Injection (DI, внедрение зависимости). DI помогает намного проще реализовывать необходимую приложениям функциональность, а также позволяет разрабатывать слабо связанные классы, делая их более универсальными.
Если Spring Framework фокусируется на предоставлении гибкости, то Spring Boot стремится сократить длину кода и упростить разработку web-приложения. Используя конфигурацию при помощи аннотаций и стандартного кода, Spring Boot сокращает время, затрачиваемое на разработку приложений. Данная возможность помогает создать автономные приложения с меньшими или почти нулевыми затратами на их конфигурацию.
Автоконфигурация — это особенность Spring Boot. При помощи аннотаций он автоматически настраивает специальные конфигурационные классы.
• Spring Framework может быть задействован на всех архитектурных слоях, применяемых при при разработке web-приложений
• Использует модель POJO при написании классов, а это очень легкая структура
• Позволяет свободно связывать модули и легко их тестировать
• Поддерживает декларативное программирование
• Избавляет от самостоятельного создания фабричных и синглтон-классов
• Поддерживает различные способы конфигурации
• Предоставляет сервис уровня middleware
Несмотря на наличие стольких преимуществ, которыми обладает Spring, длительная процедура подготовки, связанная с его настройкой, способствовала появлению Spring Boot.
Spring Boot упрощает использование Spring Framework. Spring обеспечивает слабо связанное приложение — это отличная функция. Однако, когда есть несколько слабо связанных блоков, отслеживание их становится утомительной и неблагодарной задачей. Тут-то Spring Boot и помогает упростить все, не предлагая никакой функции конфигурации.
• Spring Boot не требует развертывания war-файлов
• Создает автономные приложения
• Помогает напрямую встроить в приложение Tomcat, Jetty или Undertow
• Не требует XML-конфигурации
• Направлен на уменьшение объема исходного кода
• Имеет дополнительную функциональность «из коробки»
• Простая настройка и управление
Благодаря таким функциям, как автоконфигурация, Spring Boot избавляет вас от написания лишнего кода и помогает избежать ненужной настройки.
Spring Framework не только предлагает вам такие функции, как внедрение зависимостей или обработка транзакций, но также выступает в качестве основы для других фреймворков Spring. Лучшим примером для этого является Spring Boot. Spring Boot использует Spring Framework в качестве своей основы. Он упрощает зависимости Spring и запускает приложения прямо из командной строки. Он также не требует наличия внешнего контейнера приложений. Spring Boot помогает контролировать компоненты приложения и настраивает их извне.
В заключение отметим, что Spring Framework внес значительный вклад в развитие разработки Java EE приложений и продолжает это делать. Благодаря многим функциям, упомянутым выше, Spring Framework является отличным выбором для разработчиков. Но все достоинства этого фреймворка особенно проявляются при его использовании вместе с Spring Boot. Дополнительные преимущества, которые предоставляет Spring Boot, имеют большое значение для разработчиков, поскольку они позволяют завершать проекты с меньшими усилиями. Для задач, возникающих при использовании Spring Framework, Spring Boot является решением, которое ускорит их разработку.
Из-за громоздкой конфигурации зависимостей настройка Spring для корпоративных приложений превратилась в весьма утомительное и подверженное ошибкам занятие. Особенно это относится к приложениям, которые используют также несколько сторонних библиотек.
Каждый раз, создавая очередное корпоративное Java-приложение на основе Spring, вам необходимо повторять одни и те же рутинные шаги по его настройке:
- В зависимости от типа создаваемого приложения (Spring MVC, Spring JDBC, Spring ORM и т. д.) импортировать необходимые Spring-модули
- Импортировать библиотеку web-контейнеров (в случае web-приложений)
- Импортировать необходимые сторонние библиотеки (например, Hibernate, Jackson), при этом вы должны искать версии, совместимые с указанной версией Spring
- Конфигурировать компоненты DAO, такие, как: источники данных, управление транзакциями и т. д.
- Конфигурировать компоненты web-слоя, такие, как: диспетчер ресурсов, view resolver
- Определить класс, который загрузит все необходимые конфигурации
Авторы Spring решили предоставить разработчикам некоторые утилиты, которые автоматизируют процедуру настройки и ускоряют процесс создания и развертывания Spring-приложений, под общим названием Spring Boot.
Spring Boot — это полезный проект, целью которого является упрощение создания приложений на основе Spring. Он позволяет наиболее простым способом создать web-приложение, требуя от разработчиков минимум усилий по его настройке и написанию кода.
Spring Boot обладает большим функционалом, но его наиболее значимыми особенностями являются: управление зависимостями, автоматическая конфигурация и встроенные контейнеры сервлетов.
Чтобы ускорить процесс управления зависимостями, Spring Boot неявно упаковывает необходимые сторонние зависимости для каждого типа приложения на основе Spring и предоставляет их разработчику посредством так называемых starter-пакетов (spring-boot-starter-web, spring-boot-starter-data-jpa и т. д.).
Starter-пакеты представляют собой набор удобных дескрипторов зависимостей, которые можно включить в свое приложение. Это позволит получить универсальное решение для всех, связанных со Spring технологий, избавляя программиста от лишнего поиска примеров кода и загрузки из них требуемых дескрипторов зависимостей (пример таких дескрипторов и стартовых пакетов будет показан ниже).
Например, если вы хотите начать использовать Spring Data JPA для доступа к базе данных, просто включите в свой проект зависимость spring-boot-starter-data-jpa и все будет готово (вам не придется искать совместимые драйверы баз данных и библиотеки Hibernate).
Если вы хотите создать Spring web-приложение, просто добавьте зависимость spring-boot-starter-web, которая подтянет в проект все библиотеки, необходимые для разработки Spring MVC-приложений, таких как spring-webmvc, jackson-json, validation-api и Tomcat.
Другими словами, Spring Boot собирает все общие зависимости и определяет их в одном месте, что позволяет разработчикам просто использовать их, вместо того, чтобы изобретать колесо каждый раз, когда они создают новое приложение.
Следовательно, при использовании Spring Boot, файл pom.xml содержит намного меньше строк, чем при использовании его в Spring-приложениях.
После выбора подходящего starter-пакета, Spring Boot попытается автоматически настроить Spring-приложение на основе добавленных вами jar-зависимостей.
Если вы используете spring-boot-starter-jdbc, Spring Boot автоматически регистрирует бины DataSource, EntityManagerFactory, TransactionManager и считывает информацию для подключения к базе данных из файла application.properties.
Если вы не собираетесь использовать базу данных, и не предоставляете никаких подробных сведений о подключении в ручном режиме, Spring Boot автоматически настроит базу в памяти, без какой-либо дополнительной конфигурации с вашей стороны (при наличии H2 или HSQL библиотек).
Автоматическая конфигурация может быть полностью переопределена в любой момент с помощью пользовательских настроек.
Каждое Spring Boot web-приложение включает встроенный web-сервер. Посмотрите на список контейнеров сервлетов, которые поддерживаются «из коробки».
Разработчикам теперь не надо беспокоиться о настройке контейнера сервлетов и развертывании приложения на нем. Теперь приложение может запускаться само, как исполняемый jar-файл с использованием встроенного сервера.
Создание автономных web-приложений со встроенными серверами не только удобно для разработки, но и является допустимым решением для приложений корпоративного уровня и становится все более полезно в мире микросервисов. Возможность быстро упаковать весь сервис (например, аутентификацию пользователя) в автономном и полностью развертываемом артефакте, который также предоставляет API — делает установку и развертывание приложения значительно проще.
Want to learn more about these two popular Java frameworks? Check out this Article how they each solve a different type of problem.
What is Spring Boot? And, what is a Spring Framework? What are their goals? How can we compare them? There must be a lot of questions running through your mind. At the end of this blog, you will have the answers to all of these questions. In learning more about the Spring and Spring Boot frameworks, you will come to understand that each solve a different type of problem. More Additional Information On Spring Boot Online Training
The Spring Framework is one of the most popular application development frameworks for Java. One of the best features in Spring is that it has the Dependency Injection (DI) or Inversion Of Control (IOC), which allows us to develop loosely coupled applications. And, loosely coupled applications can be easily unit-tested.
Consider the example below — MyController depends on MyService to perform a certain task. So, to get the instance of MyService, we will use:
MyService service = new MyService();
Now, we have created the instance for MyService , and we see both are tightly coupled. If I create a mock for MyService in a unit test for MyController , how do I make MyController use the mock? It's bit difficult — isn't it?
With the help of only two annotations, we can get the instance of MyService easily, which is not tightly coupled. The Spring Framework does all the hard work to make things simpler.
- @Component is simply used in the Spring Framework as a bean that you need to manage within your own BeanFactory (an implementation of the Factory pattern).
- @Autowired is simply used to in the Spring Framework to find the correct match for this specific type and autowire it.
So, Spring framework will create a bean for MyService and autowire it into MyController .
In a unit test, I can ask the Spring Framework to auto-wire the mock of MyService into MyController .
The Spring Framework has many other features, which are divided into twenty modules to solve many common problems. Here are some of the more popular modules:
- Spring JDBC
- Spring MVC
- Spring AOP
- Spring ORM
- Spring JMS
- Spring Test
- Spring Expression Language (SpEL)
Aspect Oriented Programming(AOP) is another strong side of the Spring Framework. The key unit in object-oriented programming is the class, whereas, in AOP, the key unit is the aspect. For example, if you want to add the security in your project, logging, etc., you can just use the AOP and keep these as a cross-cutting concern away from your main business logic. You can perform any action after a method call, before a method call, after a method returns, or after the exception arises.
The Spring Framework does not have its own ORM, but it provides a very good integration with ORM, like Hibernate, Apache iBATIS, etc.
In short, we can say that the Spring Framework provides a decoupled way of developing web applications. Web application development becomes easy with the help of these concepts in Spring, like Dispatcher Servlet, ModelAndView, and View Resolver.
Now, if you have already worked on Spring, think about the problem that you faced while developing a full-fledged Spring application with all functionalities. Not able to come up with one? Let me tell you — there was lot of difficulty to setup Hibernate Datasource, Entity Manager, Session Factory, and Transaction Management. It takes a lot of time for a developer to set up a basic project using Spring MVC with minimum functionality.
When we use Hibernate, we have to configure these things like a datasource, EntityManager, etc.
- Spring Boot does all of those using AutoConfiguration and will take care of all the internal dependencies that your application needs — all you need to do is run your application. Spring Boot will auto-configure with the Dispatcher Servlet, if Spring jar is in the class path. It will auto-configue to the datasource, if Hibernate jar is in the class path. Spring Boot gives us a pre-configured set of Starter Projects to be added as a dependency in our project.
- During web-application development, we would need the jars that we want to use, which versions of the jars to use, and how to connect them together. All web applications have similar needs, for example, Spring MVC, Jackson Databind, Hibernate core, and Log4j (for logging). So, we had to choose the compatible versions of all these jars. In order to decrease the complexity, Spring Boot has introduced what we call Spring Boot Starters.
Starters are a set of convenient dependencies that you can include in your Spring Boot application. For using Spring and Hibernate, we just have to include the spring-boot-starter-data-jpa dependency in the project.
The following screenshot shows the different packages under a single dependency that are added into our application:
There are other packages that you will see. Once you add that starter dependency, the Spring Boot Starter Web comes pre-packaged with all of these. As a developer, we would not need to worry about these dependencies and their compatible versions.
These are few starter projects to help us get started quickly with developing specific types of applications.
7 Answers 7
- Spring Boot reduces the need to write a lot of configuration and boilerplate code.
- It has an opinionated view on Spring Platform and third-party libraries so you can get started with minimum effort.
- Easy to create standalone applications with embedded Tomcat/Jetty/Undertow.
- Provides metrics, health checks, and externalized configuration.
Would like a definition of opinionated . is it opinionated based on the use case. so if I use it for developing a RESTful webservice, is that opinionated slant, to do with getting the boiler-plating and 3rd part libs to get a RESTful webservice done? it would be really nice to know.
I would love myself to fully understand the concept of "opinionated view". I can see very well that it is phrase it that way on the Spring Boot website: projects.spring.io/spring-boot, but still it would be good to have an explanation of what this really means.
The definition of opinionated - characterized by conceited assertiveness and dogmatism. In simpler English, Spring Boot configures many properties about the RESTful service for you, although they could be configured differently. So they have an opinion about how things should be done and save you from a lot of extra effort. Honestly, in the end, you would probably do things the same way. But if you need to change very specific or low level properties, you still have the opportunity to do that in Spring Boot. Source: my imagination.
Basically, Spring Boot is an opinionated instance of a Spring application.
Spring Boot is a rapid application development platform. It uses various components of Spring, but has additional niceties like the ability to package your application as a runnable jar, which includes an embedded tomcat (or jetty) server. Additionally, Spring Boot contains a LOT of auto-configuration for you (the opinionated part), where it will pick and choose what to create based on what classes/beans are available or missing.
I would echo their sentiment that if you are going to use Spring I can't think of any reasons to do it without Spring Boot.
Unfortunately and I mean this out of personal frustration with Spring boot, I have yet to see any real quantified list, where the differences are explicitly outlined. There is only qualifications such as the rubbish sentence ". opinionated view. " which are bandied about.
What is clear, is that SpringBoot has wrapped up groups of Spring annotations into its own set of annotations, implicitly. Further obfuscating, and making the need for anyone starting out in SpringBoot to have to commit to memory what a particular SpringBoot annotation represents.
My reply therefore is of no quantifiable benefit to the original question, which is analogous to that of the SpringBoot authors. Those behind Spring IMO deliberately set-out to obfuscate, which reflects the obtuseness of their JavaDoc and API's (see SpringBatch API's as an example, if you think I am flaming) that makes one wonder the value of their open-source ethos.
My quest for figuring out SpringBoot continues.
thanks for this, it really clarifies what I have been trying to figure out myself. So, please correct if I am wrong, in essence SpringBoot bundles a group of Spring annotations into "its own". For example, SpringBootApplication conveniently adds Configuration, EnableAutoConfiguratio and ComponentScan. If that is correct, it seems to me that what you are saying about having to memorise the world of SpringBoot annotations as it differs from the Spring ones, it is indeed some extra work.
Better late than never. sorry for the late reply. The short answer: YES. Who is going to remember which Springboot annotation wraps what? Unless you are coding in it on a daily basis. Even then, take a recent interview I failed, in which they wanted answers to the mix. of SpringBoot and bespoke transaction management they had created for their project. there must be hundreds of non-out-of-the-box combinations of usages out there. then, THEN try to navigate their release documentation (if any). having put SpringBoot on your delivery pipeline path. OMG.
Spring Boot is opinionated view of Spring Framework projects.Let's analyse it through one program taken from Spring Boot Documentation.
It's a very basic REST API and you need to add Spring-boot-starter-web in your POM.xml for the same. Since you have added starter-web dependency, the annotation @EnableAutoConfiguration guesses that you want to develop a web application and sets up Spring accordingly.
Spring Boot auto-configuration attempts to automatically configure your Spring application based on the jar dependencies that you have added. For example, if HSQLDB is on your classpath , and you have not manually configured any database connection beans, then Spring Boot auto-configures an in-memory database.
It's opinionated like maven. Maven creates a project structure for you which it thinks is the general pattern of projects like it adds src/main/java folder or resource folder for you.
Spring boot helps in faster development. It has many starter projects that helps you get going quite faster. It also includes many non functional features like: embedded servers, security, metrics, health checks etc. In short, it makes, spring based application development easier with minimally invading code(Less configuration files, less no of annotations).
Читайте также: