Строим веб-приложение на Java без JEE и Spring

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. Но там есть всё, что мне нужно. :)

Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.

© Habrahabr.ru