Ось ознайомлення з кожною згаданими технологіями.
Весна-DAO
Spring-DAO - це не пружинний модуль у строгому сенсі, а скоріше умовності, які повинні наказувати вам написати DAO та добре їх написати. Таким чином, він не надає ні інтерфейсів, ні реалізацій, ні шаблонів для доступу до ваших даних. Під час написання DAO слід анотувати їх @Repository
так, щоб винятки, пов'язані з базовою технологією (JDBC, Hibernate, JPA тощо), послідовно переводилися у відповідний DataAccessException
підклас.
Наприклад, припустимо, що ви зараз використовуєте Hibernate, і ваш службовий шар вловлює HibernateException
, щоб реагувати на нього. Якщо ви перейдете на JPA, ваші інтерфейси DAO не повинні змінюватися, і сервісний рівень все одно буде компілюватися з блоками, які ловить HibernateException
, але ви ніколи не входите в ці блоки, оскільки ваші DAO тепер кидають JPA PersistenceException
. Використовуючи @Repository
свій DAO, винятки, пов’язані з базовою технологією, перекладаються на Spring DataAccessException
; ваш сервісний шар фіксує ці винятки, і якщо ви вирішите змінити технологію збереження, та сама Весна DataAccessExceptions
все одно буде кинута, оскільки весна переклала рідні винятки.
Однак зауважте, що це обмежене використання з наступних причин:
- Зазвичай, ви не повинні ловити винятки за стійкість, оскільки постачальник послуг може скасувати транзакцію (залежно від точного підтипу винятку), і, таким чином, вам не слід продовжувати виконання альтернативним шляхом.
- Ієрархія винятків, як правило, багатша у вашого постачальника, ніж те, що надає Spring, і немає остаточного відображення від одного постачальника до іншого. Покладатися на це небезпечно. Однак, це гарна ідея анотувати ваші DAO
@Repository
, оскільки квасоля буде автоматично додана процедурою сканування. Крім того, Весна може додати до примітки інші корисні функції.
Весна-JDBC
Spring-JDBC надає клас JdbcTemplate, який видаляє сантехнічний код і допомагає сконцентруватися на SQL-запиті та параметрах. Вам просто потрібно налаштувати його за допомогою "A" DataSource
, а потім можете написати такий код:
int nbRows = jdbcTemplate.queryForObject("select count(1) from person", Integer.class);
Person p = jdbcTemplate.queryForObject("select first, last from person where id=?",
rs -> new Person(rs.getString(1), rs.getString(2)),
134561351656L);
Spring-JDBC також пропонує JdbcDaoSupport, який ви можете розширити, щоб розробити свій DAO. В основному він визначає 2 властивості: DataSource та JdbcTemplate, які обидва можуть бути використані для реалізації методів DAO. Він також забезпечує перекладач винятків з винятків SQL до весняних DataAccessExceptions.
Якщо ви плануєте використовувати звичайний jdbc, це модуль, який вам потрібно буде використовувати.
Весна-ОРМ
Spring-ORM - це парасольовий модуль, який охоплює багато стійких технологій, а саме: JPA, JDO, Hibernate та iBatis. Для кожної з цих технологій Spring надає класи інтеграції, так що кожна технологія може бути використана відповідно до принципів конфігурації Spring і плавно інтегрується з управлінням транзакцій Spring.
Для кожної технології конфігурація в основному полягає у введенні DataSource
бобів в якийсь боб SessionFactory
або EntityManagerFactory
ін. Для чистого JDBC немає необхідності в таких класах інтеграції (крім JdbcTemplate), оскільки JDBC покладається лише на джерело даних.
Якщо ви плануєте використовувати ORM на зразок JPA або Hibernate, вам не знадобиться spring-jdbc, а лише цей модуль.
Spring-Data
Spring-Data - це парасольовий проект, який пропонує загальний API для визначення способу доступу до даних (DAO + анотації) більш загальним способом, що охоплює і джерела даних SQL, і NOSQL.
Початкова ідея полягає в тому, щоб забезпечити технологію, щоб розробник записував інтерфейс для DAO (методів пошуку) та класів сутності технологічно-агностичним способом і, виходячи лише з конфігурації (анотації про DAO та сутності + весняна конфігурація, будь то xml- або java) визначає технологію впровадження, будь то JPA (SQL) або redis, hadoop тощо (NOSQL).
Якщо ви дотримуєтесь імен імен, визначених весною для імен методу finder, вам навіть не потрібно вводити рядки запитів, що відповідають методам пошуку для найбільш простих випадків. В інших ситуаціях вам потрібно надати рядок запиту всередині приміток до методів пошуку.
Коли завантажується контекст програми, spring надає проксі для інтерфейсів DAO, які містять весь код платформи, пов'язаний з технологією доступу до даних, і викликає налаштовані запити.
Spring-Data концентрується на не-SQL-технологіях, але все ще надає модуль для JPA (єдиної технології SQL).
Що далі
Знаючи все це, тепер вам належить вирішити, що вибрати. Хороша новина тут полягає в тому, що вам не потрібно робити остаточний остаточний вибір технології. Тут власне джерело живлення Spring: як розробник, ви зосереджуєтесь на бізнесі, коли ви пишете код, і якщо ви робите це добре, зміна базової технології є деталлю реалізації або конфігурації.
- Визначте модель даних з класами POJO для сутностей та отримайте / встановіть методи представлення атрибутів сутності та зв'язків з іншими сутностями. Вам, звичайно, потрібно буде коментувати класи та поля сутностей на основі технології, але поки що POJO досить для початку. Просто зосередиться на вимогах бізнесу на даний момент.
- Визначте інтерфейси для своїх DAO. 1 DAO охоплює рівно 1 об'єкт, але вам, звичайно, не знадобиться DAO для кожного з них, оскільки ви повинні мати можливість завантажувати додаткові об'єкти, переходячи до відносин. Визначте методи пошуку, дотримуючись строгих угод про іменування.
- Виходячи з цього, хтось інший може розпочати роботу над рівнем послуг, з макетами для ваших DAO.
- Ви дізнаєтесь різні технології збереження (sql, no-sql), щоб знайти найкраще відповідні ваші потреби, і вибираєте одну з них. Виходячи з цього, ви коментуєте сутності та реалізуєте DAO (або дозволяєте весняним чином реалізувати їх для вас, якщо ви вирішите використовувати джерельні дані).
- Якщо бізнес-вимоги розвиваються і вашої технології доступу до даних недостатньо для її підтримки (скажімо, ви почали з JDBC та кількома сутностями, але тепер потрібна більш багата модель даних, а JPA - кращий вибір), вам доведеться змінити реалізацію своїх DAO, додайте кілька анотацій про ваші сутності та змініть конфігурацію весни (додайте визначення EntityManagerFactory). У решті коду вашого бізнесу не повинно відображатися інших впливів на вашу зміну.
Примітка: Управління транзакціями
Spring пропонує API для управління транзакціями. Якщо ви плануєте використовувати весну для доступу до даних, ви також повинні використовувати весну для управління транзакціями, оскільки вони дуже добре інтегруються разом. Для кожної технології доступу до даних, що підтримується весною, існує відповідний менеджер транзакцій для локальних транзакцій, або ви можете вибрати JTA, якщо вам потрібні розподілені транзакції. Усі вони реалізують один і той же API, так що (вкотре) вибір технології - це лише питання конфігурації, яку можна змінити без подальшого впливу на бізнес-код.
Примітка: Весняна документація
Посилання на весняну документацію, про яку ви згадали, досить старі. Ось документація останнього випуску (4.1.6, що охоплює всі теми):
Дані Spring не є частиною весняних рамок. Існує загальний модуль, який слід спочатку прочитати, щоб звикнути до принципів. Документацію можна знайти тут: