Недавно, когда я увидел метод шаблона Spring Jdbctemplete, я очень заинтересовался шаблонами и обратными обращениями, и я запросил некоторую информацию и сделал некоторую резюме.
Функция обратного вызова:
Так называемый обратный вызов означает, что клиентская программа C вызывает определенную функцию A в сервисной программе S, а затем S вызывает определенную функцию B в C в C в какое-то время. Для C этот B называется функцией обратного вызова. Функция обратного вызова - это просто функция, которая реализована пользователем в соответствии с соглашением о вызове обратного вызова. Функция обратного вызова является частью рабочего процесса, и рабочий процесс определяет время вызова функции (обратный вызов). Вообще говоря, C не будет называть B сам по себе. Целью C предоставления B состоит в том, чтобы позволить S назвать его, и C должен его предоставить. Поскольку S не знает, кто B назван в честь C, S согласится с спецификацией интерфейса B (прототип функций), а затем C заранее сообщит S, что он будет использовать функцию B через функцию R S. Этот процесс называется регистрацией функции обратного вызова, а R называется регистрационной функцией. Веб -сервис и Java RMI используют механизмы обратного вызова для доступа к программам удаленного сервера. Функция обратного вызова содержит следующие характеристики:
1. принадлежит часть рабочего процесса;
2. Он должен быть объявлен (определено) в соответствии с вызовом соглашения, указанного рабочим процессом;
3. Время его вызова определяется рабочим процессом. Реализатор функции обратного вызова не может напрямую вызвать функцию обратного вызова, чтобы реализовать функцию рабочего процесса;
Механизм обратного вызовов:
Механизм обратного вызовов является общей моделью дизайна. Он раскрывает функцию в рабочем процессе внешним пользователям в соответствии с согласованным интерфейсом, предоставляет данные внешним пользователям или требует, чтобы внешние пользователи предоставляли данные.
Механизм обратного вызова Java:
Между программными модулями всегда есть определенные интерфейсы. С точки зрения методов вызова, их можно разделить на три категории: синхронные вызовы, обратные вызовы и асинхронные вызовы.
Синхронный звонок: блокирующий звонок, абонент должен ждать, пока другая сторона завершит выполнение перед возвращением. Это односторонний звонок;
Обратный вызов: двухсторонний режим вызова, то есть, называемая партия также позвонит в интерфейс другой стороны при вызове интерфейса;
Асинхронный вызов: механизм, похожий на сообщение или событие, но его направление вызова - как раз наоборот. Когда сервис интерфейса получает определенное сообщение или происходит событие, она будет активно уведомлять клиента (то есть вызовать интерфейс клиента).
Отношения между обратными вызовами и асинхронными вызовами очень тесно связаны: обратные вызовы используются для реализации регистрации асинхронных сообщений, и уведомление о сообщениях достигается с помощью асинхронных вызовов.
Экземпляр обратного вызова
1. Интерфейс обратного вызова
Callback public Interface {String callback (); } 2. вызывающий абонент
открытый класс еще один {приватный обратный вызов; // вызов метода, который реализует класс public void setCallback (обратный вызов) {this.callback = callback; } // Когда бизнес нуждается в этом, вызовите конкретный метод, который реализует класс public void docallback () {System.out.println (callback.callback ()); }} 3. Функция обратного вызова тестирования
открытый класс testcallcack {public static void main (string [] args) {// создать класс реализации вызывающего абонента еще один = новый другой (); // Зарегистрируйте обратный интерфейс в класс реализации merence.setCallback (new Callback () {@Override public String callback () {return "Вы - свинья";}}); // Выполнить функцию обратного вызова shene.docallback (); }}Использование методов обратного вызова обычно происходит при использовании «интерфейса Java» и «абстрактного класса». Паттерн проектирования метода шаблона использует механизм обратного вызова метода. Этот шаблон сначала определяет скелет алгоритма определенных шагов и задерживает некоторые шаги к шаблону проектирования, реализованного в подклассе. Схема проектирования метода шаблона позволяет подклассам переопределить определенные конкретные шаги алгоритма без изменения структуры алгоритма.
Применимость шаблона проектирования шаблонов:
1. Реализуйте неизменную часть алгоритма одновременно и оставьте алгоритм переменной для подклассов для его реализации.
2. Поведение общественности в каждом подклассе должно быть извлечено и сконцентрировано в общественном родительском классе, чтобы избежать дублирования кода.
3. Расширения подкласса можно контролировать.
Пример шаблона:
Аннотация Метод шаблона класс:
Общественный абстрактный класс AbstractSup {// Методы, которые требуют реализации подкласса Public Abstract void Print (); // метод шаблона public void doprint () {System.out.println ("execute template method"); for (int i = 0; i <3; i ++) {print (); }}} Класс метода реализации подкласса:
Общедоступный класс Subclass расширяет AbstractSup {@Override public void print () {System.out.println («Метод реализации подклассов»); }} Тестовый класс метода шаблона:
открытый класс Templetetest {public static void main (string [] args) {subclass subclass = new subclass (); subclass.print (); subclass.doprint (); }} Ниже приведено подробное введение в использование метода шаблона пружины. Взяв в качестве примера JDBCTEMPLETE, мы подробно объясним использование режима шаблона и механизм обратного вызова.
Во -первых, давайте посмотрим на классический пример программирования JDBC:
public list <user> Query () {list <user> userlist = new ArrayList <user> (); String sql = "select * из пользователя"; Соединение con = null; Подготовленное Statatement PST = NULL; Результат RS = NULL; try {con = hsqldbutil.getConnection (); pst = con.prepareStatement (SQL); rs = pst.executequery (); Пользователь пользователь = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setusername (rs.getString ("user_name")); user.setbirth (rs.getdate ("рождение")); user.setCreatedate (rs.getDate ("create_date")); userlist.add (пользователь); }} catch (sqlexception e) {e.printstacktrace (); } наконец {if (rs! = null) {try {rs.close (); } catch (sqlexception e) {e.printstacktrace (); }} try {pst.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }} return userlist; }
Простой запрос требует такого большого количества вещей, а также имеет дело со исключениями. Давайте разберемся, если мы не хотим:
1. Получите соединение
2. Получить заявление
3. Получить результаты
4. ОТВЕТИТЬ через результат и инкапсулируйте его в коллекцию
5. Закрыть соединение, заявление и результаты, в свою очередь, и рассмотрим различные исключения и т. Д.
Если несколько запросов будут генерировать больше дубликата кода, вы можете использовать механизм шаблона. Благодаря наблюдению мы обнаружили, что большинство из вышеперечисленных этапов повторяются и повторно используются. Только при прохождении результатов и инкапсулировании его в коллекцию настраивается, потому что каждая таблица отображает различные бобы Java. Невозможно повторно использовать эту часть кода, ее можно только настроить.
Аннотация Код класса:
Общедоступный абстрактный класс jdbctemplate {// метод шаблона публичный конечный объект выполнение (String sql) выбрасывает sqlexception {connection con = hsqldbutil.getConnection (); Утверждение stmt = null; try {stmt = con.createStatement (); ResultSet rs = stmt.executequery (sql); Object Result = doInstatement (RS); // Аннотация Метод (настроенный метод, необходимая реализация подкласса) Результат возврата; } catch (sqlexception ex) {ex.printstacktrace (); бросить бывш; } наконец {try {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}} // Аннотация Метод (пользовательский метод) защищенный абстрактный объект doInstatement (Resultset RS); }В этом абстрактном классе инкапсулируется основной процесс API Sun JDBC, и этап пересечения результатов находится в абстрактном методе DoInstatement (), который реализован подклассом.
Код реализации подкласса:
открытый класс jdbctemplateUserimpl extends jdbctemplate {@Override Protected Object doInstatement (Resultset RS) {list <user> userList = new ArrayList <user> (); try {user user = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setusername (rs.getString ("user_name")); user.setbirth (rs.getdate ("рождение")); user.setCreatedate (rs.getDate ("create_date")); userlist.add (пользователь); } return userList; } catch (sqlexception e) {e.printstacktrace (); вернуть ноль; }}}В методе doinstatement () мы пересекаем результат и, наконец, возвращаем его.
Тестовый код:
String sql = "select * из пользователя"; Jdbctemplate jt = new jdbctemplateUserimpl (); Список <user> userlist = (list <user>) jt.execute (sql);
Механизм шаблона использовался до сих пор, но если вам нужно наследовать родительский класс каждый раз, когда вы называете JDBctemplate, это довольно неудобно, поэтому механизм обратного вызова может сыграть роль.
Так называемый обратный вызов означает передачу интерфейса в параметрах метода. Когда родительский класс вызывает этот метод, он должен вызвать класс реализации интерфейса, передаваемого в методе.
Реализация режима шаблона обратного вызова плюс
Интерфейс обратного вызова:
public interface ratementcallback {Object doInstatement (оператор STMT) выбрасывает SQLexception; } Метод шаблона:
открытый класс jdbctemplate {// метод шаблона public final ocome execute (atportioncallback action) выбрасывает sqlexception {connection con = hsqldbutil.getConnection (); Утверждение stmt = null; try {stmt = con.createStatement (); Object result = action.doinstatement (rs); // метод обратного вызова } catch (sqlexception ex) {ex.printstacktrace (); бросить бывш; } наконец {try {stmt.close (); } catch (sqlexception e) {e.printstacktrace (); } try {if (! con.isclosed ()) {try {con.close (); } catch (sqlexception e) {e.printstacktrace (); }}} catch (sqlexception e) {e.printstacktrace (); }}}} public Object Query (оператор Callback STMT) Throws SQLexception {return execute (stmt); }}} Протестированный класс:
public Object Query (Final String SQL) Throws SQLexception {Class QueryStateMentCallback реализует atudeCallback {public Object doInstatement (оператор STMT) Throws SQLexception {ResultSet rs = stmt.executequery (sql); Список <user> userList = new ArrayList <user> (); Пользователь пользователь = null; while (rs.next ()) {user = new user (); user.setid (rs.getint ("id")); user.setusername (rs.getString ("user_name")); user.setbirth (rs.getdate ("рождение")); user.setCreatedate (rs.getDate ("create_date")); userlist.add (пользователь); } return userList; }} Jdbctemplate jt = new jdbctemplate (); return jt.query (new QueryStatementCallback ()); }
Почему весна не использует традиционные методы шаблона, но и сотрудничать с обратным вызовом?
Представьте себе, что если в родительском классе есть 10 абстрактных методов, и все подклассы, которые наследуют его для реализации всех этих 10 абстрактных методов, подкласс будет выглядеть очень раздутым. Иногда, что мне делать, если подкласс должен только настроить определенный метод в родительском классе? В настоящее время используется обратный вызов.
Кроме того, приведенный выше метод в основном реализует метод шаблона + режим обратного вызова. Но это все еще немного далеко от весеннего jdbctemplate. Несмотря на то, что мы реализовали метод шаблона + режим обратного вызова выше, он кажется немного «уродливым» по сравнению с JDBctemplate Spring. Spring представляет концепции Rowmapper и ResulteExtractor. Интерфейс Rowmapper отвечает за обработку определенной строки данных. Например, мы можем работать на определенной строке записей в методе MapRow или инкапсулировать его в сущность. ResultseTextractor - это экстрактор набора данных, который отвечает за пересечение результатов и обработку данных в соответствии с правилами в Rowmapper. Разница между Rowmapper и ResultseTextractor заключается в том, что Rowmapper обрабатывает определенную строку данных и возвращает объект объекта. ResultseTextractor обрабатывает набор данных и возвращает коллекцию объектов.
Конечно, вышеупомянутое является лишь основными принципами реализации Spring JdBctemplate. Spring Jdbctemplate сделал больше вещей, таких как инкапсуляция всех основных операций в интерфейс JDBCoperations и использование JDBCACCORSOR для управления данными и исключениями из преобразования.
Выше приведено в этой статье, я надеюсь, что это будет полезно для каждого обучения.