HotLog

суббота, 19 февраля 2011 г.

Spring: lazy-init.

Рассмотрим вот этот проект.

ChildLazy объявлен как @Lazy, значит он будет загружен по первому требованию (но не раньше).
ChildNormal как @Lazy не объявлен, значит он будет загружен при старте приложения.
Composite так же не @Lazy.

Запустим SpringStart, вывод будет такой:
created LazyChild
created NormalChild
Composite is ready
Composite.printNormalChild
NormalChild.print()
Composite.printLazyChild
LazyChild.print()

Видно, что LazyChild загрузился одновременно с NormalChild. Случилось это потому, что Composite, являясь бином-синглетоном, требует LazyChild в качестве своего свойства.

Задачу решает создание ScopedProxy для LazyChild: таким образом в соответствующее свойство Composite будет проставлена только обертка, а сам LazyChild создастся только в том случае, если кто-нибудь вызовет какой-нибудь метод на прокси.
Выглядеть это будет так:


Запустив, получаем:
created NormalChild
Composite is ready
Composite.printNormalChild
NormalChild.print()
Composite.printLazyChild
created LazyChild
LazyChild.print()

Из последних трех строчек видно, что задача решена.

вторник, 8 февраля 2011 г.

Компилируем rt.jar c debug информацией.

Задача: добавить debug-информацию в rt.jar.
Шаги решения:
  1. Распаковываем src.zip в c:\_temp\jdk_src\
  2. Запускаем консоль в папке с распакованными файлами
  3. Выполняем в консоли "dir /S /B *.java > build.cmd" (без кавычек)
  4. Открываем build.cmd любимым текстовым редактором
  5. Заменяем "C:\_temp\jdk_src\" на "javac -g C:\_temp\jdk_src\"
  6. Запускаем build.cmd
  7. Долго ждем
  8. Добавляем с заменой скомпилированные файлы в rt.jar
  9. Пользуемся

Готовый rt.jar для jdk1.6.0_23 можно скачать тут.

суббота, 5 февраля 2011 г.

Spring-mvc 3.0: пишем простейшее web-приложение.

В этой заметке я предлагаю попробовать "на вкус" популярный веб-фреймворк swing-mvc.

Исходный код проекта можно скачать по этой ссылке

Напишем простейший калькулятор, позволяющий складывать два числа. Выглядеть он будет так:


Spring-mvc работает так:
  1. ищется метод-контроллер, который может обработать данный запрос
  2. в метод передаются параметры из запроса
  3. метод выполняется, возвращая модель (ModelMap)
  4. в соответствии с ViewResolver'ом ищется jsp, которая будет отображать ответ
  5. найденная jsp рендерится с учетом параметров из ModelMap

Будем использовать maven и структура проекта будет следующая:
C:\WORK\SIMPLE-SPRING-PROJECT
├───src
│   └───main
│       ├───java
│       │   └───com
│       │       └───blogspot
│       │           └───fuud
│       │               └───java
│       │                   └───simple
│       │                       └───spring
│       │                           └─────SampleController.java
│       └───webapp
│           └───WEB-INF
│               ├───pages
│               │   └────calc.jsp
│               ├────dispatcher-servlet.xml
│               └────web.xml
└───pom.xml

pom.xml выглядит так:


Я добавил в плагины jetty, что бы можно было запускать наше приложение прямо из консоли командой:


Следующий на очереди web.xml:


В web.xml я определяю, где находится главный spring-context, определяю DispatcherServlet как сервлет по умолчанию для всего приложения. Обратите внимание, что паттерн для сервлета задан как /, а не как /* - потому как все содержимое папки WEB-INF должно обрабатываться обычным образом.

На очереди calc.jsp:


И контроллер:


Аннотацией @Controller я говорю spring'у, что методы этого класса будут обрабатывать входящие запросы (какие именно, указанно в аннотации @RequestMapping). Параметры помечены как необязательные в виду того, что при первом входе на страничку пользователь еще ничего не ввел - и эту ситуацию надо корректно обрабатывать.

И, наконец, мы добрались до ядра нашего приложения dispatcher-servlet.xml:


Сначала я настраиваю спринг использовать аннотации:


Потом говорю в каком пакете он должен искать аннотированные файлы:


Потом определяю, как из реквеста получать файлы для отображения (в данном случае в начало имени добавится "/WEB-INF/pages/", а в конце добавится ".jsp"):


Вот и все: запускаем проект, выполнив в корне mvn jetty:run и заходим броузером на страничку
http://localhost:8080/simple-swing-project/calc
И радуемся спрингу!