0

Ранее я использовал аннотации Spring MVC и hibernate в своем проекте веб-приложений Google. Запуск приложения после развертывания занимает некоторое время.Аннотации Spring MVC с производительностью XML

По этой причине я перехожу к подходу Spring MVC на основе XML только для контроллера. Однако для классов обслуживания и DAO @Service и @Repository аннотации остаются такими, как есть.

В моей Spring XML я делаю, как, как показано ниже (нет боба тегов определен для обслуживания и DAO классов):

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" /> 
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /> 
<bean class="com.my.controller.UserController"> 
    <property name="domainManager" ref="domainManager"/> 
    <property name="userProfileDao" ref="userProfileDao"/> 
</bean> 

Внутри UserController, я не использую любую @autowired аннотацию. Я использую комбинацию аннотаций с XML. Существуют ли какие-либо недостатки такого подхода? Неужели я ошибаюсь?

+0

Вы можете смешать ароматы Spring DI просто отлично, и люди делают это все время. Я не знаю, как это ускорит время запуска приложения, и почему бы ни было заботиться о том, как долго приложение запускается, но опять же я не знаю ваших требований. Просто FYI, Spring Apps, как правило, страдают от более медленного запуска, потому что весь «тяжелый подъем» DI, который возникает при запуске, что обычно означает, что многие классы Singleton получают встроенный фронт. Но первоначальная стоимость обычно означает меньше времени на выполнение GC и строительных объектов позже. – CodeChimp

+0

Для проекта приложения Google каждый запрос должен быть завершен в течение 30 секунд или 1 м. Я не эксперт в Spring mvc. Согласно моим наблюдениям, использующим аннотации после развертывания, для запуска приложения требуется много времени, так как все зависимости должны быть установлены и конфигурированы в первом запросе. но для зависимостей на основе xml, установленных во время компиляции. пожалуйста, поправьте меня, если мое понимание ошибочно.? – RBP

+0

Это совершенно неправда.Независимо от того, используете ли вы на основе аннотаций или на основе XML, DI происходит при запуске, если вы не помечаете свои бобы как прототипы, и в этом случае они создаются по каждому запросу. XML вообще ничего не делает во время компиляции, так что снова мне любопытно, почему вы воспринимаете увеличение скорости при запуске при использовании XML над аннотациями. Если вы не сообщите Spring сканировать ВСЕ пакеты для аннотированных классов, но тогда вы неправильно используете Spring в этот момент. Кроме того, этот 30-секундный срок, это по запросу или для приложения, которое находится в состоянии «готовности» (запуск)? – CodeChimp

ответ

0

Разница заключается не в использовании аннотации или XML, а между Autowiring и «ручных инъекциях beans».

EDIT: @ Автоматическое и компонентное сканирование компонентов делают то же самое.

Вы можете «вручную вводить» бобы как с XML и полной Java @Configuration, эквивалент вашего примера будет:

@Configuration 
public class WebAppConfig { 

    @Bean 
    public UserDao userDao() { 
    return new UserDao(); 
    } 

    @Bean 
    public UserController userController() { 
    UserController ctrl = new UserController(); 
    ctrl.setUserDao(userDao()); 
    return ctrl; 
    } 

} 

вопрос довольно точно, потому что сама команда Engine App показал, что Время работы приложения Engine было плохим при сканировании траекторий (которое Autowiring делает, чтобы найти совпадения по классу).

Потеря производительности при запуске экземпляра может произойти, если вы делаете:

public class UserController { 

    @Autowired 
    private UserDao userDao; 

    // ... 
} 

Смотрите это видео, особенно вопрос из (Spring Framework) Pivotal автора: http://www.youtube.com/watch?v=lFarE1hH0ss

Мало кто знает о Эта проблема. Использование Spring AOP может даже полностью потерпеть крах в производственной среде. См.: Using Spring AOP on App Engine causes StackOverflowError

Так что о вашем использовании XML, нет «правильного или неправильного». Лично мне не нравится писать XML, так как я чувствую, что он более подвержен ошибкам, но некоторые люди любят четко отделять свою конфигурацию от своего кода. Я все еще использую autowiring в производстве, поскольку время запуска не является проблемой для меня. Сделайте то, что вам и вашей команде комфортно, просто учтите ограничения GAE.

+0

Да, я столкнулся с этой проблемой времени начала. Итак, я пошел на xml-подход. Но делаю это также, получая такую ​​же проблему. Лучше сохранить предыдущий подход на основе аннотаций, как есть. Как вы имеете дело со временем запуска? может дать мне некоторое предложение преодолеть это? Если вам нужен какой-то из моего кода, я могу вставить его. Я дал базовое имя pkg в сканировании компонентов. пожалуйста, помогите мне преодолеть эти проблемы. – RBP

+0

Ну, в конце концов, я не обрабатывал время запуска, я заплатил за пару незанятых экземпляров, которые только что остались: https://developers.google.com/appengine/docs/adminconsole/performancesettings#Setting_the_Number_of_Idle_Instances ... Вы могли бы также, возможно, ping ваше приложение или определить задание cron, чтобы поддерживать его: http://stackoverflow.com/questions/1113066/how-to-keep-an-app-engine-java-app-running-with-deaf-requests -from-a-java-python. Когда мое приложение НЕОБХОДИМО, чтобы держать моих клиентов на борту, я просто заплатил за мир. –

+0

hmmm.I использую задания cron, чтобы сохранить приложение в живых. Один маленький вопрос, могу ли я установить зависимости в xml, как я уже упомянул раньше, вместо использования @autowired аннотации? это уменьшит время сканирования? и это увеличит производительность немного.? – RBP

Смежные вопросы