Я багато чую про Весну , люди в усьому Інтернеті говорять, що Весна є гарною основою для веб-розробки. Для чого саме Spring Framework?
Я багато чую про Весну , люди в усьому Інтернеті говорять, що Весна є гарною основою для веб-розробки. Для чого саме 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();
Це не має жодної проблеми з такою невеликою програмою, як ця, але ... Що відбувається в програмі, яка має сотні переглядів та аналогічну кількість бізнес-класів? Технічне обслуговування стає кошмаром!
Що весна робить, це з'єднати класи за допомогою XML-файлу чи приміток, таким чином всі об'єкти ініціюються та ініціалізуються Spring та вводяться у потрібні місця (сервлети, веб-рамки, бізнес-класи, DAO, тощо, тощо, тощо, тощо) ...).
Повернувшись до прикладу навесні, нам просто потрібно мати сеттер для 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
та полегшіть розвиток погляду.Існує ще кілька варіантів ін'єкції залежності, що, на мій погляд, зробило Весну такою відомою, окрім її простоти, елегантності та стабільності, що хлопці SpringSource запрограмували безліч POJO, які допомагають інтегрувати Spring з багатьма іншими загальними рамками, не будучи нав'язливий у вашій програмі. Крім того, у Spring є кілька хороших підпроектів, таких як Spring MVC, Spring WebFlow, Spring Security і знову луанг-список тощо.
Сподіваюсь, це допомагає. У будь-якому разі, я закликаю вас прочитати статтю Мартіна Фаулера про впорскування залежностей та інверсію управління, оскільки він робить це краще, ніж я. Після розуміння основи поглянути на Спрінг документації , на мій погляд, це буде використовуватися , щоб бути кращою книгою 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, а іноді ви можете захотіти Sedan. Дійсно залежить, що ви хочете, виходячи з конкретної ситуації.
Щоб вирішити цю проблему, ви хочете, щоб заводський візерунок був як креативний шаблон. Де завод повертає потрібний екземпляр. Таким чином, у кінцевому підсумку ви отримаєте багато клей-коду, щоб правильно створити об'єкти. Spring найкраще виконує роботу з клейовим кодом без коду клею. Ви оголошуєте відображення в XML, і вони автоматично ініціалізують об'єкти. Він також багато використовує одиночну архітектуру для примірників, що допомагає в оптимізованому використанні пам'яті.
Це також називається Інверсія управління. Інші рамки для цього - Google Guice, контейнер Pico тощо.
Крім цього, Spring має рамки валідації, широку підтримку шару DAO у співпраці з JDBC, iBatis та Hibernate (та багато іншого). Забезпечує чудовий транзакційний контроль над транзакціями бази даних.
До Весни є набагато більше, що можна прочитати в хороших книгах, таких як "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
У минулі часи Весна була лише роботою кадру для ін'єкцій залежностей ( Guice , PicoContainer , ...), але сьогодні це загальне рішення для створення вашої Enterprise Application .
Весняна ін'єкційна залежність, яка, звичайно, є серцем весни, все ще є (і інші хороші відповіді ви можете переглянути тут), але з весни їх є більше ...
Весна зараз має безліч проектів, кожен з яких має кілька підпроектів ( http://spring.io/projects ). Коли хтось говорить про весну, ви повинні дізнатися, про який проект весни він говорить, це лише весняний стрижень, який відомий як весняний каркас , або це ще один весняний проект.
Деякі весняні проекти, які варто також згадати:
Якщо вам потрібна якась додаткова функція для вашої програми, ви також можете її знайти там:
Є також кілька крихітних проектів, наприклад, весна-соціальна-facebook ( http://projects.spring.io/spring-social-facebook/ )
Ви можете використовувати весну для веб-розробки, оскільки в ній є Spring MVC
модуль, який є частиною проекту Spring Framework . Або ви можете використовувати весну з іншим веб-рамкою, наприклад, 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
дітьми? На щастя, у Java не існує багаторазового успадкування.
Весна - це три речі.
Проблема полягає в тому, що весна DI справді добре продумана, обгортки навколо інших речей справді добре продумані в тому, що інші речі все продумали, а весна просто гарно обгортає це. Реалізація MVC та REST Spring та всі інші речі не так добре виконані (YMMV, IMHO), але є винятки (Spring Security - це бомба). Тому я схильний використовувати Spring для DI та його крутих обгортків, але віддаю перевагу іншим речам для Інтернету (мені дуже подобається Tapestry), REST (Джерсі справді міцний) тощо.
Що ви, мабуть, хотіли б у веб-додатку із Spring -
Крім того, Spring - ВЕЛИЧЕЗНА - тому існує багато інших речей, які можуть вам зацікавитись у веб-додатку, наприклад Spring AOP або Spring Security. Але чотири речі, перелічені вище, описують загальні компоненти Spring, які використовуються у веб-програмі.
Я бачу дві частини до цього:
Зауважте, що ви можете ідеально використовувати Spring у веб-додатку, не використовуючи Spring MVC. Я б сказав, що більшість веб-додатків Java роблять це, використовуючи інші веб-рамки, такі як Wicket, Struts, Seam, ...
Весна чудово підходить для склеювання примірників занять разом. Ви знаєте, що вашим класам сплячки завжди потрібен джерело даних, Spring з'єднує їх разом (і також має реалізацію джерела даних).
Ваші об’єкти доступу до даних завжди потребуватимуть режиму глибокого сну, Весна залучає класи Зимового режиму до ваших DAO для вас.
Крім того, Spring в основному дає вам суцільні конфігурації з ряду бібліотек, і в цьому дає вам рекомендації щодо того, які бібліотеки ви повинні використовувати.
Весна - це справді чудовий інструмент. (Я не говорив про Spring MVC, просто про базові рамки).
Прийнята відповідь не передбачає використання приміток, оскільки Spring представив підтримку різних приміток для конфігурації.
Є ще один спосіб з’єднати класи поряд із використанням XML-файлу: примітки. Давайте використовувати приклад з прийнятого відповіді і зареєструвати компонент безпосередньо на класі , використовуючи один з анотацій @Component
, @Service
, @Repository
або @Configuration
:
@Component
public class UserListerDB implements UserLister {
public List<User> getUsers() {
// DB access code here
}
}
Таким чином, коли подання буде створене, він магічно створить UserLister, готовий працювати.
Вищенаведене твердження дійсне з невеликим бонусом, не потребуючи жодного використання XML-файлів та проводки з іншою приміткою, @Autowired
яка знаходить відповідну реалізацію та вводить її.
@Autowired
private UserLister userLister;
Використовуйте @Bean
примітку до методу, який використовується для отримання ін'єкції бобів.
@Bean
примітку на рівні класу. Повинен бути один з @Component
, @Service
, і @Repository
т.д. Rest є правильним. Можливо, вам слід також зазначити, що автоматичне підключення інтерфейсу таким чином працюватиме лише у тому випадку, якщо в класі classpath є лише 1 кандидат-клас, що підходить для ін'єкцій, інакше помилка програми Spring.
Перевага - залежність впорскування (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
}
}
У вищевказаному класі, залежно від нашого настрою, ми вибираємо шведський стіл () або Plated (). Однак ця система тісно поєднана. Кожен раз, коли нам потрібен інший тип Об'єкта, нам потрібно змінити код. У цьому випадку, коментуючи рядок! Уявіть, що існує 50 різних класів, якими користуються 50 різних людей. Це було б пекло безладу. У цьому випадку нам потрібно роз’єднати систему. Давайте перепишемо клас LunchDecide.
public class LunchDecide {
private Lunch todaysLunch;
public LunchDecide(Lunch todaysLunch){
this.todaysLunch = todaysLunch
}
}
Зауважте, що замість створення об'єкта за допомогою нового ключового слова ми передали посилання на об’єкт типу Lunch як параметр нашому конструктору. Тут створення об'єктів передається в аутсорсинг. Цей код можна з'єднати з використанням конфігураційного файлу Xml (спадщина) або Java Анотації (сучасний). Так чи інакше, рішення про те, який тип об’єкта буде створено, буде прийматися там під час виконання. Об'єкт буде введений Xml в наш код - наш Код залежить від Xml для цієї роботи. Отже, впорскування в залежності (DI). DI не тільки допомагає зробити нашу систему вільно поєднаною, але спрощує написання тестів Unit, оскільки дозволяє глузувати залежності. І останнє, але не менш важливе, DI впорядковує програмування, орієнтовану на аспекти (AOP), що призводить до подальшої розв'язки та збільшення модульності. Також зауважте, що вище DI - це впорскування конструктора.
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 !
Весна - хороша альтернатива технології Enterprise JavaBeans (EJB) . Він також має веб-фреймворк та компонент рамок веб-служб.
Весна почалася як досить проста система впорскування залежності. Зараз він величезний і в ньому є все (крім прислів’я кухонної мийки).
Але не бійтеся, він досить модульний, тому ви можете використовувати лише потрібні вам частини.
Щоб побачити, з чого все почалося, спробуйте:
Це може бути старим, але це відмінна книга.
Ще одну добру книгу, що цього разу виключно присвячена Весні, див:
Він також посилається на більш старі версії Spring, але, безумовно, варто їх переглянути.
Весна була спочатку ін'єкцією залежності, а потім додайте коротку обгортку майже для всього (обгортка над реалізацією JPA тощо).
Довга історія ... Більшість частин весняних рішень XML (механізм сценаріїв XML ... brrrr), тому для DI я використовую Guice
Хороша бібліотека, але із зростанням depnedenciec, наприклад Spring JDBC (можливо, одне рішення jdbc Java з параметрами реальних імен) береться від maven 4-5 наступного.
Використання Spring MVC (частина "великої весни") для веб-розробки ... це "базована на запитах" рамка, існує свята "запит проти компонента" ... до вас
Раніше я думав про весняні рамки з суто технічної точки зору.
Враховуючи певний досвід роботи в команді та розвитку корпоративного Webapps - я б сказав, що Spring призначений для більш швидкого розвитку додатків (веб-додатків) шляхом роз'єднання окремих елементів (бобів). Швидше розвиток робить його таким популярним. Весна дозволяє перекладати відповідальність за створення (підключення) програми до рамки Весна. Інжекційна залежність Spring Spring відповідає за підключення / підключення окремих бобів до робочого додатку.
Таким чином розробники можуть бути зосереджені більше на розробці окремих компонентів (бобів), як тільки будуть визначені інтерфейси між квасолею.
Тестування такого застосування просте легко - головна увага приділяється окремим бобам. Їх можна легко відокремити та знущатися, тому тестування одиниць швидко та ефективно.
Весняна рамка визначає кілька спеціалізованих бобів, таких як @Controller ( @Restcontroller ), @Repository , @Component для обслуговування веб-цілей. Весна разом з Maven забезпечують інтуїтивно зрозумілу розробникам структуру. Робота в команді проста і швидка, оскільки є окремі елементи, які відокремлюються і можуть бути використані повторно.
Весняні рамки, безумовно, хороші для веб-розробки та більш конкретні для спокійних сервісних програм.
Це добре для вище з - за його ін'єкції залежностей і інтеграції з іншими модулями , такими як ярий безпеки , Spring AOP , MVC Framework , microservices
З будь-яким додатком безпека, швидше за все, є вимогою.
Якщо ви прагнете створити продукт, який потребує тривалого обслуговування, вам знадобиться використовувати концепцію Aop.
Якщо ваш додаток має багато трафіку, збільшуючи навантаження, вам потрібно використовувати концепцію мікропослуг.
Весна надає всі ці особливості на одній платформі. Підтримка багатьох модулів .
Найголовніше, що весна є відкритим кодом та розширюваною рамкою, є гачок скрізь, щоб інтегрувати спеціальний код у життєвий цикл.
Spring Data - це проект, який забезпечує інтеграцію з вашим проектом.
Тож весна може вписатися майже в кожну вимогу.