ПОЧЕМУ
В начале своего рождения основной целью создания пружины было заменить более тяжелые технологии Java на уровне предприятия, особенно EJB. По сравнению с EJB Spring обеспечивает более легкую и более простую модель программирования.
ЧТО
Spring - это каркас с открытым исходным кодом, впервые созданный Роджонсоном. Весна была создана для решения сложности разработки приложений на уровне предприятия. Использование Spring может позволить простым Javabeans реализовать вещи, которые мог бы достичь только EJB. Весна не ограничивается разработкой на стороне сервера, любое Java-приложение может извлечь выгоду из Spring с точки зрения простоты, тестируемости и свободной связи.
Сегодня весна участвует в мобильной разработке, интеграции социальных API, базе данных NOSQL, облачных вычислениях и больших данных. Со временем EJB также принял концепции инъекции зависимости (DI) и ориентированного на аспект программирования (AOP). Короче говоря, самая фундаментальная миссия весна - упростить разработку Java
КАК
Чтобы уменьшить сложность развития Java, Spring принимает 4-минутную ключевую стратегию
Легкое и минимальное инвазивное программирование, основанное на POJO, позволяет свободно связать инъекцию зависимостей и ориентированные на границы раздела
Декларативное программирование на основе разделов и соглашений снижает код стиля через разделы и шаблоны
По потенциал POJO
Многие структуры заставляют приложения наследовать свои классы или реализовать свои интерфейсы, что приводит к приложениям, связанным с структурой, которая является инвазивным программированием, что приводит к неспособности повторно использовать кодовые блоки. Spring стремится не испортить код вашего приложения из -за своего собственного API. В приложениях, построенных на весне, его классы обычно не имеют следов каких -либо признаков, которые вы используете Spring.
открытый класс helloworldbean {public String sayshello () {return "Hello World"; }} Приведенный выше пример кода представляет очень простой и обычный класс Java (POJO). Вы не можете сказать, что это пружинный компонент. Неинвазивное программирование Spring отражено в этом классе, которое может сыграть роль как в весенних приложениях, так и в приложениях, не являющихся пружинами. Только этот фрагмент кода на самом деле не отражает функции Spring, и следующие знания все еще необходимы.
Инъекция зависимости (инъекция самого класса зависит от)
Инъекция зависимости не так высока весной, хотя она превратилась в сложную технику программирования или концепцию дизайна. Это понимается весной, инъекционными зависимостями. Приложение с практическим значением требует, чтобы несколько классов сотрудничали друг с другом для завершения конкретной бизнес -логики. Традиционная практика заключается в том, что каждый объект отвечает за управление ссылками на объекты, связанные с самим собой (этот связанный объект - это объект, который зависит от объекта, выраженного весной), но это затруднит проверку высокопоставленного и кода.
Рассмотрим следующий код
/** Это название класса с трудом в покое было специально названо автором, чтобы соответствовать смоделированной сцене* Этот класс представляет рыцаря, которая спасла девушку*, созданную Wung в 2016/8/25. */Public Class DamelescuingNightNight реализует Knight {Private RescuedamSelquest Quest;/*** Созданный RescuedAmselquest в своем конструкторе* Это делает DamelescuinguingNight и RescuingDamselquest в своем конструкторе, соединенном вместе*/public dAbselRescuingNight (). embarkonquest () {Quest.embark ();}} Связь имеет две стороны. С одной стороны, тесно связанный код трудно проверить, повторно использовать и понимать, и будут ошибки типа «борьба с гоблином». С другой стороны, необходима определенная степень связи, и различные классы должны взаимодействовать соответствующим образом.
Проблема возникает, так как это решила весна?
Весной, посредством инъекции зависимостей (DI), зависимости между объектами устанавливаются сторонними компонентами в системе, которые координируют каждый объект при создании объекта. Другими словами, объекты должны только управлять своими внутренними свойствами, не создавая и не управляя их зависимостями самостоятельно, и зависимости будут автоматически вводить в объекты, которые им нужны.
/*** Этот рыцарь может выполнять различные задачи приключений, а не только предыдущий, чтобы спасти девушку*, созданную Wung на 2016/8/25. */Public Class BraveKnight реализует Knight {Private Quest Quest;/*** BaveKnight не создает типы приключений самостоятельно, но выполняет задачи приключений в виде параметров во время строительства* Это один из способов инъекции зависимости: конструктор инъекции*/public BaveKnight (Quest Quest) {this.quest = Quest;} public embarkest () {Quest.) BraveKnight не связан с какой -либо конкретной реализацией квестов. Пока задача реализует интерфейс Quest, не имеет значения, какой тип приключений это. Это достигает цели диа - свободной связи
Если объект указывает только зависимость через интерфейс, то эту зависимость может быть заменена различными конкретными реализациями без осознания самого объекта.
Итак, давайте внедрим практическое значение
Для приведенного выше кода мы внедрим приключенческую задачу с конкретной реализацией в храброго рыцаря
/** Приключенческая миссия по убийству драконов (этот автор-хороший второй класс)*создана Wung 2016/8/25. */public Class Slaydragonquest реализует Quest {private PrintStream Stream; public slaydragonquest (printstream stream) {this.stream = stream;} public void embark () {stream.print ("Убейте дракон");}}}}}}}}}}}}}}}Итак, теперь вопрос в том, как вводить объект PrintStream, от которого он зависит в Slaydragonquest, как вводить объект Quest, от которого он зависит в Braveknight. Вышеупомянутая пружина будет централизованно управлять этими зависимостями, и поведение создания сотрудничества между компонентами приложения обычно называется сборкой (проводка), то есть инъекцией. Spring предоставляет различные методы сборки для более подробного введения позже. Здесь мы кратко представляем сборку на основе XML и сборки на основе аннотаций Java.
<!- Это процесс сборки. Объявите Slaydragonquest как боб, названный «Quest». Поскольку это инъекция конструктора, используйте значение атрибута Constructor-Arg, чтобы представлять инъекционное значение. Этот процесс решает предыдущую проблему. Введите объект PrintStream в объект Slaydragonquest-> <bean id = "Quest"> <constructor-arg value = "#{t (system) .out}"> </constructor-arg> </bean> <!-Этот процесс такой же, как и выше. BraveKnight объявляет о бобах с именем «рыцаря» (это имя не обязательно используется), тогда параметр конструктора BraveKnight должен быть типом квеста. В настоящее время в ссылке проходит еще один боб, который является ссылкой на бобов с названием «Quest» выше. В настоящее время инъекция конструктора BraveKnight также завершена-> <Bean id = "knight"> <constructor-arg ref = "Quest"> </constructor-arg> </bean>Spring предоставляет конфигурации на основе Java, которые можно использовать в качестве альтернативы XML
/** Файл конфигурации на основе Java реализует сборку объектов*, созданную Wung на 2016/8/26. */ @ConfigurationPublic Class KnightConfig {@bean public knight () {return new BraveKnight (Quest ()); } @Bean public Quest () {return new slaydragonquest (System.out); }}Эффекты одинаковы, и конкретное объяснение подробно описано в следующей главе. Давайте рассмотрим это снова. Говорят, что весна будет автоматически управлять зависимостями между объектами, так что же это за менеджером? Ответ - это контекст приложения, который является контейнером для пружины, который может загружать определения бобов и собрать их. Контекст приложения Spring несет единоличную ответственность за создание и сборку объектов. На самом деле, есть много способов реализовать разницу между этим контекстом, только разница в загрузке конфигурации. Давайте посмотрим способ загрузить конфигурацию.
открытый класс Knightmain {public static void main (string [] args) {annotationConfigApplicationContext context = new AnnotationConfigApplicationContext (knightConfig.class); // Определение боба может быть получено из файла конфигурации. Knight Knight = context.getbean (knight.class); knight.embarkonquest (); context.close (); }}Нанесите нарезание лица
DI может сохранять совместные программные компоненты свободно связанными, в то время как программирование аспектов позволяет вам разделять функции по всему приложению для формирования многократных компонентов, и, в частности, это технология, которая приводит к тому, что программные системы стремятся к фокусировке. Что фокус? Системные услуги, такие как ведение журнала, управление транзакциями и управление безопасности, часто должны быть интегрированы в другие компоненты, которые сами имеют бизнес -логику. Эти системные службы обычно называют фокусом по перекрестному обрезанию, потому что они будут повторно использованы в нескольких местах, охватывающих несколько компонентов системы. Проще говоря, вы извлекаете услуги, которые необходимо использовать повторно из различных других компонентов, но как их использовать? На самом деле, он должен вставить метод в места, которые вам нужно использовать при его использовании. Однако в соответствии с этим термином «раздел» он должен быть выражен в качестве извлечения повторного использования компонента в качестве секции, и разрезая сечение через компонент при необходимости. Таким образом, основные приложения не должны знать существование этих разделов, и разделы не будут интегрировать бизнес -логику в основные приложения.
/** Класс певцов используется для хвалить рыцарей, то есть служить рыцарям*, созданным Вунгом на 2016/8/26. */Public Class Minestrel {Private PrintStream Stream; Public Minestrel (PrintStream Stream) {this.stream = Stream; } // Выполнить public void singbeforequest () {stream.print ("begin"); } // Выполнить public void singafterquest () {stream.print ("end"); }} public class BraveKnight implements Knight{private Quest quest;private Minstrel minstrel;/** * BraveKnight does not create adventure types on its own, but passes adventure tasks as parameters in construction* This is one of the ways of dependency injection: constructor injection*/// public BraveKnight(Quest quest){// this.quest = quest;// }public BraveKnight(Quest quest, Minstrel Minestrel) {this.quest = Quest; this.minstrel = minestrel;} public void embarkonquest () {minster.singbeforequest (); Quest.embark (); Minstrel.singafterquest ();}} В настоящее время смелый рыцарь начал казнить, но он обнаружил, что в своих обязанностях это был не просто риск, но теперь ему пришлось управлять певцом, чтобы похвалить его, но это само по себе не должно принадлежать к категории, которой следует управлять. Поэтому, используя идею разделов, мы должны извлечь поведение певца и стать разделом. Прежде чем кавалеры рискуют, этот раздел будет вырезан, и выполнить метод SingbeforeQuest и выполнить метод SingafterQuest после риска. Таким образом, это осознает код, который не должен хвалить рыцаря, и певец не существует в объекте рыцаря. Он не только восхваляет рыцаря, но и хвалит кого -либо, пока другие используют этот раздел для входа.
<!-означает, что настройка фасоли с приведенным выше идентификатором в качестве менестреля в качестве секции фактически настройка певца как раздел-> аспект ref = "Менестрель"> <!-Определение точки входа, то есть, где использовать раздел Express = "execution ( * * .embarkonquest (..))-это точечный язык. Выполнение после ноты до и после вырезания точки входа-> </aop: после> </aop: до> </aop: pointcut> </aop: </aop: config>
Ситуация в том, что Менестрель все еще является независимым Pojo, и контекст пружины превратил его в раздел. Самое главное, что рыцарь не имеет представления о существовании этого раздела в настоящее время. Это всего лишь маленький каштан, который на самом деле может сделать много важных вещей.
Используйте шаблоны для устранения кода стиля
Существует ситуация, когда мы используем JDBC для доступа к базе данных для запроса данных, полный процесс требует установления соединений, создания объектов операторов, наборов результатов обработки, запроса и закрытия различных соединений. Кроме того, запечатлены различные исключения, а затем запросы в различных сценариях требуют такого кропотливого повторения. JDBC - не только единственный случай, когда есть много кода стиля. Весна направлена на устранение кода стиля через инкапсуляцию шаблонов, такую как Spring's JDBctemplate.
Приспособим свой фасоль
В весенних приложениях ваши объекты приложения живут в весенних контейнерах, которые отвечают за создание объектов, собранных объектов, и управлении их жизненными циклами. Так что же такое пружинный контейнер? Есть не только один тип контейнера. Весна поставляется с несколькими реализациями контейнеров. Он разделен на две категории: фабрики из бобов, которые являются самыми простыми контейнерами, обеспечивающими базовую поддержку DI. Контекст приложения является относительно продвинутым и предоставляет услуги на уровне приложений. В большинстве случаев контекст приложения более популярен.
Контекст приложения также разделен на множество различных способов загрузки конфигураций.
Различные весенние особенности
Суммировать
Spring - это структура, которая может упростить разработку, а ее основной контент - DI и AOP.
Выше приведено сплетни об этой статье - постепенно понимать весь контент весны, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Пример начала работы SpringMVC
Подробное объяснение кода для значения атрибута инъекции с использованием файлов конфигурации и @Value по пружине
Spring Integrated Redis Подробный пример кода
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это.