2015-01-08 45 views
2

我必須爲使用spring mvc的銀行設計一個非常大型的項目。我已經選擇使用XML配置。我關心的是限制服務器的啓動時間。將會有大約2000個控制器。如何在沒有使用xml進行組件掃描的情況下配置控制器?

我已經使用組件掃描來掃描@Controller。它運行良好。但問題是,當我從XML中刪除組件掃描並使用XML配置手動添加控制器bean時,它並未在IOC容器中創建控制器實例。並給我404未找到錯誤。那麼如何在沒有XML掃描的情況下配置控制器。

以下是我的代碼示例。任何幫助?

servlet的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也應該是一個單身而不是原型(沒有狀態,所以它的原型範圍是沒有意義的)。另外,當使用組件掃描(我真的建議你這樣做)時,你不應該使用''''掃描所有東西,你應該限制它到你自己的包和'servlet-context'來掃描僅適用於控制器。這將減少掃描類的數量並加快啓動時間。 –

回答

0

問題爲什麼你404 - Not Found是使用標籤<context:annotation-config/>只有的。

<context:annotation-config/>僅激活已註冊到您的應用程序上下文的bean的註釋,併爲您執行基本的自動裝配。它不會自動檢測和註冊bean。

所以沒有這樣的Controllers可供您處理請求。

爲了配置控制器你要麼切換回context:component-scan其反正是爲你工作(不考慮採取M. Deinum建議而恢復手動經由HandlerMappings配置控制器以相應的URL,如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配置。我配置了一個沒有xml配置的spring3.2項目。它完全是基於註釋的。Web應用程序Initializer

覆蓋啓動:爲應用程序上下文

@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操作

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));   
    } 
} 

配置文件。配置文件中有一個ComponentScan註釋,它將掃描來自您的基礎包的所有彈簧註釋。

+2

但我不想使用組件掃描。因爲它增加了服務器啓動時間。將會有大約2000個控制器,服務和daos。但是,我已經使用xml和懶加載的bean來配置它,以便在服務器啓動時花費最少的時間。 –

+0

然後你必須'手動配置控制器到相應的URL'作爲@Bond –

+0

Ya。我已經做到了。然而,謝謝你的建議 –

相關問題