Spring'деги маалыматка жетүү объектине (Data Access Object/DAO) колдоо көрсөтүү маалыматка жетүү технологиялары менен иштөөнү жеңилдетүүгө багытталган (мисалы, JDBC, Hibernate же JPA). Бул туруктуу сактоо технологияларынын арасында оңой которулууга мүмкүндүк берет жана ар бир технологияга мүнөздүү болгон ката кармоого кабатыр болуунун кереги жок.
Каталардын бирдей иерархиясы
Spring технологияга мүнөздүү каталардан, мисалы SQLException
сыяктуу, өзүңдүн каталар иерархиясына өтүү мүмкүнчүлүгүн берет, мында негизги ката DataAccessException
болуп эсептелет. Бул каталар баштапкы катаны оройт, ошондуктан кайсы бир маалыматты жоготуп алуу коркунучу жок.
JDBC каталарына кошумча, Spring JPA жана Hibernate өзгөчө каталарын дагы ороп, аларды уюшулган каталар топтомуна өзгөртө алат. Бул туруктуу сактоо калыбына келтирилгис каталарын тиешелүү деңгээлдерде гана иштеп чыгууга мүмкүндүк берет, "catch-and-throw" стереотиптүү блокторуна кайрылбастан жана DAO'нузда каталарды жарыялоодон качууга жардам берет. (Бирок, сиз каалаган жерде каталарды кармап жана иштеп чыгууга дагы да болот). Жогоруда айтылгандай, JDBC каталары (маалымат базасына мүнөздүү диалекттерди кошкондо) дагы ошол эле иерархияга айландырылат, демек, сиз JDBC боюнча бир нече операцияларды бирдей программалоо моделинде ишке ашыра аласыз.
Өткөн түшүндүрмө ар түрдүү ORM фреймворкторундагы Spring колдоо куралдарындагы класстарга дагы тиешелүү. Эгерде сиз перехватчи класстарын колдонсоңуз, колдонмо HibernateExceptions
жана PersistenceExceptions
иштеп чыгуу менен өзү алектенет, аны SessionFactoryUtils
утилитасынын convertHibernateAccessException(..)
же convertJpaAccessException(..)
методдоруна тапшырган артык. Бул ыкмалар каталарды org.springframework.dao
каталар иерархиясына шайкеш келген каталарга айландырат. PersistenceExceptions
текшерилбегендиктен, алар дагы да генерацияланышы мүмкүн (мында, чындыгында, DAO каталар типтештирилген абстракциясынан курмандык чалуу болот).
Кийинки сүрөттө Spring сунуш кылган каталардын иерархиясы көрсөтүлгөн. (Сүрөттө көрсөтүлгөн класстар иерархиясы DataAccessException
иерархиясынын бир гана бөлүгүн көрсөтөт).

DAO класс же репозиторийлердин конфигурациясы үчүн колдонулуучу аннотациялар
Объекттериңиздин (DAO) же репозиторийлериңиздин каталарды трансляциялоосун камсыз кылуунун эң жакшы жолу @Repository
аннотациясын колдонуу. Бул аннотация компоненттерди сканерлөө колдоо куралдарыңыз DAO жана репозиторийлериңизди табууга жана конфигурациялоого XML конфигурация жазууларысыз мүмкүндүк берет. Төмөнкү мисалда @Repository
аннотациясын колдонуу көрсөтүлгөн:
@Repository
public class SomeMovieFinder implements MovieFinder {
// ...
}
@Repository
аннотациясы.
@Repository
class SomeMovieFinder : MovieFinder {
// ...
}
@Repository
аннотациясы.
DAO же репозиторийдин каалаган имплементациясына туруктуу сактоо ресурсуна жетүү талап кылынат, колдонулган туруктуу сактоо технологиясына жараша. Мисалы, JDBC негизиндеги репозиторийге JDBC'деги DataSource
'го жетүү талап кылынат, ал эми JPA негизиндеги сактоочуга EntityManager
'ге. Бул жетишүү үчүн эң жөнөкөй жолу @Autowired
, @Inject
, @Resource
же @PersistenceContext
аннотацияларынын бирин колдонуу менен ресурстун көз карандысын инъекция кылуу. Төмөнкү мисал JPA репозиторийине байланыштуу иштейт:
@Repository
public class JpaMovieFinder implements MovieFinder {
@PersistenceContext
private EntityManager entityManager;
// ...
}
@Repository
class JpaMovieFinder : MovieFinder {
@PersistenceContext
private lateinit var entityManager: EntityManager
// ...
}
Эгерде классикалык Hibernate API интерфейстерин колдонсоңуз, SessionFactory
инъекция кылса болот, төмөнкү мисалда көрсөтүлгөндөй:
@Repository
public class HibernateMovieFinder implements MovieFinder {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
// ...
}
@Repository
class HibernateMovieFinder(private val sessionFactory: SessionFactory) : MovieFinder {
// ...
}
Акыркы мисал типтүү JDBC колдоо куралына тиешелүү. DataSource
инициализация методуна же конструкторго инъекция кылына алат, анда сиз JdbcTemplate
жана башка маалыматка жетүү колдоо класстарын (мисалы, SimpleJdbcCall
ж.б.) түзөсүз, бул DataSource
'ту колдонуу менен. Төмөнкү мисалда DataSource
'ту автоматтык түрдө табуу жана байланыш жасоо:
@Repository
public class JdbcMovieFinder implements MovieFinder {
private JdbcTemplate jdbcTemplate;
@Autowired
public void init(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}
// ...
}
@Repository
class JdbcMovieFinder(dataSource: DataSource) : MovieFinder {
private val jdbcTemplate = JdbcTemplate(dataSource)
// ...
}
GO TO FULL VERSION