Данная статья будет интересна тем, кто вдруг осознал, что ему хочется
попробовать создать что-то без навязанного обществом 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;
//создаем контекст
DAO dao = new DAO(...);
MailService mails = new MailService(...);
AsyncService async = new AsyncService(...);
Context c = new Context(dao, mails, async);
//создаем контейнер
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. Но там есть всё, что мне нужно. :)
Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.