Строим веб-приложение на Java без JEE и Spring
Данная статья будет интересна тем, кто вдруг осознал, что ему хочетсяпопробовать создать что-то без навязанного обществом 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. Но там есть всё, что мне нужно. :)
Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.