2

Мне нужно разработать проект очень крупного масштаба для банка с использованием весеннего mvc. Я уже решил пойти с конфигурацией XML. Моя задача - ограничить время запуска сервера. Будет около 2000 контроллеров.Как настроить контроллер весной без сканирования компонентов в xml?

Я уже использую компонентное сканирование для сканирования @Controller. Он работал нормально. Но проблема заключается в том, что когда я удаляю проверку компонентов из XML и добавляю компонент контроллера, используя конфигурацию bean-компонентов вручную в XML, он не создавал экземпляр контроллера в контейнере IOC. И дает мне 404 не найденную ошибку. Итак, как я могу настроить контроллер без сканирования компонентов в XML.

Подходы являются моими образцами кода. Любая помощь?

сервлет-context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 

    <context:annotation-config/> 

    <mvc:resources mapping="/resources/**" location="/resources/" /> 

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/pages/" /> 
     <property name="suffix" value=".jsp" /> 
    </bean> 

    <!--<context:component-scan base-package="" />--> 
</beans> 

корня context.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd"> 

    <import resource="dataContext/data-context.xml" /> 

    <bean id="contactSetupController" class="com.stl.afs.ci.cca.controller.ContactSetupController"> 
     <property name="contactSetupDao" ref="contactSetupDao" /> 
    </bean> 

    <bean id="contactSetupDao" class="com.stl.afs.ci.cca.controller.ContactSetupDao" scope="prototype"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

</beans> 

ContactSetupController.java

package com.stl.afs.ci.cca.controller; 

import org.hibernate.Query; 
import org.hibernate.SessionFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Lazy; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 


@Controller 
@RequestMapping("/contactsetup") 
public class ContactSetupController { 
    private static final Logger logger = LoggerFactory.getLogger(ContactSetupController.class); 


    private ContactSetupDao contactSetupDao; 

    public void setContactSetupDao(ContactSetupDao contactSetupDao) { 
     this.contactSetupDao = contactSetupDao; 
    } 

    @RequestMapping(method = RequestMethod.GET) 
    public String index(ModelMap model) { 
     contactSetupDao.showDepedency(); 

     model.addAttribute("message", "Hello world! Nice to see you in the planet"); 
     return "ci/contactsetup/index"; 
    } 
} 

ContactSetupDao.java

package com.stl.afs.ci.cca.controller; 

import org.hibernate.Query; 
import org.hibernate.SessionFactory; 
import org.springframework.transaction.annotation.Transactional; 

import java.util.List; 

/** 
* Created by ARNAB on 1/8/2015. 
*/ 
public class ContactSetupDao { 
    public ContactSetupDao() { 
     System.out.println("------DAO------"); 
    } 

    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sessionFactory) { 
     System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@" + sessionFactory); 
     this.sessionFactory = sessionFactory; 
    } 

    @Transactional(readOnly = true) 
    public void showDepedency(){ 
     Query query = sessionFactory.getCurrentSession().createSQLQuery("SELECT * FROM customers"); 
     int i = 0; 
     for (Object o : query.list()) { 
      i++; 
     } 
     System.out.println(i); 
    } 

} 
+1

Ваши контроллеры должны находиться в 'servlet-context.xml' не' root-context.xml'. Ваш dao также должен быть одноэлементным, а не прототипом (нет состояния, поэтому нет смысла делать его прототипом области). Кроме того, при использовании сканирования компонентов (что я действительно предлагаю вам делать) вы не должны использовать '' '' для сканирования, поскольку это сканирует все, вы должны ограничить его собственным пакетом (-ами) и для «сервлет-контекста» для сканирования только для контроллеров. Это уменьшит количество классов для сканирования и ускорит время запуска. –

ответ

0

Проблема, почему вы получаете 404 - Not Found является использование тега <context:annotation-config/>только.

<context:annotation-config/> только активирует аннотацию на бобы, которые уже зарегистрированы в контексте вашего приложения и делает базовое автоуведомление для вас. Он не обнаруживает и не регистрирует бобы.

Таким образом, нет таких как Controllers, доступных для обработки запроса.

Для того, чтобы настроить контроллеры вы либо переключатель обратно в context:component-scan, который так или иначе работает для вас (ли рассмотреть возможность принятия М. Deinum предложение, а возвращаясь) или вручную настроить контроллеры на соответствующий URL, с помощью HandlerMappings, таких как SimpleUrlHanslerMapping (не рекомендуется из-за многословие участия)

PS: читает this fabulous post обсуждал различие между <context:annotation-config> в nd <context:component-scan>

1

How can I configure the controller without component scanning in XML?. вы можете использовать настройку на основе аннотаций, чтобы избежать XML.

Проверьте это EnableWebMvc Конфигурация. Я настроил проект spring3.2 без конфигурации xml. это была полная аннотация.

перезапись запуск веб-приложения Initializer: файл

public class Initializer implements WebApplicationInitializer { 
    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException 
    { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 
     ctx.setServletContext(servletContext); 

     ServletRegistration.Dynamic dispatcher = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     dispatcher.setLoadOnStartup(1); 
     dispatcher.addMapping("/"); 

     servletContext.addListener(new ContextLoaderListener(ctx));   
    } 
} 

Конфигурация для контекста приложения

@Configuration 
@ComponentScan("com.paul.nkp")  // set your root package, it will scan all sub-package 
@EnableWebMvc 
@EnableTransactionManagement 
@PropertySource("classpath:com/paul/nkp/application.properties") 
public class WebAppConfig extends WebMvcConfigurerAdapter { 

    /** 
    * configured for read property values using @Value attibutes 
    * 
    * @return 
    */ 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer placeHolderConfigurer() { 
     return new PropertySourcesPlaceholderConfigurer(); 
    } 

    @Bean(name = "multipartResolver") 
    public static MultipartResolver multipartResolver() { 
     return new CommonsMultipartResolver(); 
    } 
    @Bean 
    public LocalSessionFactoryBean sessionFactory() throws PropertyVetoException, IOException { 
     LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
     ...... 
     sessionFactoryBean.setHibernateProperties(getHibernateProperties()); 
     System.out.println("Session Factory Init"); 

     return sessionFactoryBean; 
    } 
} 

Теперь все в коде, не манипуляции XML. В файле конфигурации есть аннотация «ComponentScan», которая сканирует все весенние аннотации из вашего базового пакета.

+2

Но я не хочу использовать поиск компонентов. Потому что это увеличивает время запуска сервера. Будет около 2000 контроллеров, сервисов и даос. Тем не менее, я уже настроил его с помощью xml и ленивой загрузки бобов, так что при запуске сервера требуется минимальное время. –

+0

, тогда вам нужно «вручную настроить контроллеры на соответствующие URL», как указано @Bond –

+0

Ya. Я уже это сделал. И, тем не менее, спасибо за предложение –

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