Строим веб-приложение на 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. Но там есть всё, что мне нужно. 🙂

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

ссылка на оригинал статьи http://habrahabr.ru/post/220713/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *