如何在没有组件扫描的情况下在xml中配置控制器?

我必须使用spring mvc为银行设计一个非常大规模的项目。 我已经选择使用XML配置。 我担心的是限制服务器的启动时间。 将有大约2000个控制器。

我已经使用组件扫描来扫描@Controller 。 它工作正常。 但是,问题是当我从XML中删除组件扫描并在XML中手动使用bean配置添加控制器bean时,它没有在IOC容器中创建控制器实例。 并给我404未找到的错误。 那么如何在没有XML扫描的组件的情况下配置控制器。

以下是我的代码示例。 有帮助吗?

servlet的context.xml中

         <!---->  

根的context.xml

           

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

How can I configure the controller without component scanning in XML? 。 您可以使用基于注释的配置来避免XML。

检查此EnableWebMvc配置。 我配置了一个没有xml配置的spring3.2项目。 它完全基于注释。

覆盖Web应用程序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注释,它从您的基础包中扫描所有spring注释。

您获得404 - Not Found仅在于使用标记

仅激活已在您的应用程序上下文中注册的bean上的注释,并为您执行基本的自动assembly 。 它不会自动检测和注册bean。

因此没有可用的Controllers来处理请求。

为了配置控制器,您可以切换回context:component-scan ,无论如何都适合您( 在恢复时考虑采用M. Deinum建议通过HandlerMappings手动配置控制器到各自的URL,如SimpleUrlHanslerMapping ( 不建议由于涉及的冗长

PS:请阅读这篇精彩的post,讨论之间的区别