Первые пять копеек от меня:
1. Плагины перегружаются и переконфигурируются слишком часто из-за этого будет проседать производительность.
Предложене: создать сервлет-фильтр, который будет подгружать плагины один раз за запрос и куда-нибудь сохранять список активных плагинов (например, в атрибут запроса)
2. Класс, который определяет всякие ссылки для топиков (EntityToDtoConverter) слишком общий. Его нужно разбить на что непосредственно конвертер и что-то типа UrlFactory. Тогда UrlFactory можно будет использовать в контроллерах и email сервисах для определения ссылок без преобразования Topic в TopicDto
3. На данный момент мы создаём новый объект VelocityEngine при каждом запросе к контроллеру плагина. Это не есть хорошо. Нужно сделать VelocityEngine полем класса QuestionsAndAnswersController и инициализировать один раз при инициализации контроллера.
4. У нас слишком много синглтонов.
Тут у меня есть 2 варианта:
- Дёргать классы сервисов из application-контекста
- Создать класс типа ServiceHolder, который будет хранить в себе все бины сервисов используемые в плагинах, передавать этот ServiceHolder в конструктор контроллера при его инициализации и уже там инициализировать нужные сервисы.
Отказ от синглтонов должен упростить тестирование контроллеров.
Замечания приветствуются.