Pull to refresh

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

Reading time2 min
Views39K


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

Если данная тематика зацепит читателей, то я с удовольствием продолжу знакомить вас с миром вне Фреймворка.
Tags:
Hubs:
Total votes 49: ↑30 and ↓19+11
Comments30

Articles