![](http://habrastorage.org/getpro/habr/post_images/5b3/16a/a49/5b316aa497ab8e99daa51c7112d55cea.jpg)
Данная статья будет интересна тем, кто вдруг осознал, что ему хочется
попробовать создать что-то без навязанного обществом JEE и Spring.
Вы, о дорогой Java Смельчак, не хотите быть винтиком в огромном механизме вашего Фреймворка?
Вам надоело чувствовать себя «машинисткой» по написанию конфигов и настроек?
Вы хотите решать задачи так, как хочется вам, а не так, как это видится автору унифицированной на нужды
миллионов библиотеки?
Тогда добро пожаловать под кат, где я поделюсь с вами полезными находками Мира без Фреймворка.
Все дело в Контейнере
Как вы помните JEE или Spring (далее просто Фреймворк) завлекает прежде всего
возможностью Контейнера в котором будут жить ваши небольшие компоненты и сервисы.
Но ведь мы можем создать его сами.
Это просто.
Создаем Контекст через который доступно все, что нужно для работы:
public class Context { public final DAO dao; public final MailService mails; public final AsyncService async; public App root; public Context( DAO dao, MailService mails, AsyncService async) { this.dao = dao; this.mails = mails; this.async = async; } }
Создаем Контейнер, в котором будут жить все наши Сервисы:
public class App { public final SecurityService security; public final CommentService comments; public final UserService users; public App(Context c) { c.root = this; this.security = new SecurityService(c); this.users = new UserService(c); this.comments = new CommentService(c); } }
В Сервисах у нас находятся бизнес-методы.
Через Контекст они смогут получить доступ к нужным ресурсам (как БД или другие Сервисы).
Пример:
class CommentService { DAO dao; MailService mails; UserService users; public CommentService(Context c){ dao = c.dao; mails = c.mails; users = c.root.users; } public Result getComments(Req req){ List comments = dao.getComments(req); User user = users.getCurUser(); mails.sendMail(); } }
Осталось только создать один экземпляр Контейнера на всё веб-приложение:
public class SingleApp { private static App app; public static synchronized App get() { if(app != null) return app; //создаем контекст Context c = new Context(); ... //создаем контейнер app = new App(c); return app; } }
И использовать Сервисы из Контейнера в своей работе:
@WebServlet("/comments") public class GetCommentsServlet extends HttpServlet { CommentService comments; public void init() { App app = SingleApp.get(); comments = app.comments; } protected void doGet(HttpServletRequest req, HttpServletResponse resp) { List result = comments.getComments(...); req.setAttribute("comments", result); req.getRequestDispatcher("/WEB-INF/jsp/comments.jsp").forward(req, resp); } }
Итог
Двумя-тремя простейшими классами нам удалось создать себе условия для комфортной работы без Фреймворка.
Нам не понадобилось 5 мегабайт библиотек, наше решение стартует максимально быстро (т.к. в нем есть только то,
что нужно именно нам), его легко запустить в юнит тестах.
Но главное: мы видим весь цикл работы приложения и можем его менять как нам вздумается.
На примере данного подхода я создал вот этот небольшой веб-сервис. И остался доволен результатами.
Там нет JEE, там нет Spring. Но там есть всё, что мне нужно. 🙂
Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.
ссылка на оригинал статьи http://habrahabr.ru/post/220713/
Добавить комментарий