SpringMVC学习(controller层加载控制与(业务、功能)bean加载控制、Web容器 ...

打印 上一主题 下一主题

主题 981|帖子 981|积分 2943

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
目录
  一、SpringMVC、Spring的bean加载控制。
  (1)现实开发的包结构条理。
  (2)怎样"精准"控制两个容器分别加载各自bean。(分析)
  <1>SpringMVC相干bean加载控制。(方法)
  <2>Spring相干bean加载控制。(方法)
  二、Spring配置类——bean加载控制。
  (1)方法一:设定精确范围。
  <1>controller层。
  <2>Spring配置类。
  <3>SpringMVC配置类。
  (2)方法二:直接扫描主包(com.xxx),再排除controller包。
  <1>排除过滤器(excludeFilters)与包罗过滤器(includeFilters)。
  <2>设置过滤规则(type)与过滤范例(classes)。
  <3>最终的Spring配置类。
  三、Web容器初始化配置类加载Spring情况。
  <1>方法createRootApplicationContext()。
  <2>Web容器配置类实现AbstractDispatcherServletInitializer类。(bean加载格式)
  <3>实现类AbstractAnnotationConfigDispatcherServletInitializer 。(更简单利用)
  
  
  
  一、SpringMVC、Spring的bean加载控制。

   (1)现实开发的包结构条理。

  

  • 在简单的SpringMVC入门案例中:团体项目的核心包结构只有controller层与config层。
  • SpringMVC学习(入门案例思绪及实现、Web容器初始化与SpringMVC配置类)(2)-CSDN博客
  
  

  • 但现实上真正的项目没有这么简单。其项目的重要包结构如下所示:
  • config目录。包罗Web容器初识化配置类、Spring配置类、SpringMVC配置类。(代替传统开发的XML配置文件)
  
  

  • controller目录。其内部是所有SpringMVC需要加载的bean。
  
  

  • servicedao等目录。其内部都是各种业务bean、功能bean。而这些bean都是需要让Spring加载。
  • 此中Spring需要管理的业务bean(service层)。需要管理的功能bean(第三方bean)如:DataSource(数据源对象)、SqlSessionFactoryBean等等MyBatis相干bean。
  

  
  (2)怎样"精准"控制两个容器分别加载各自bean。(分析)

  <1>SpringMVC相干bean加载控制。(方法)

  

  • 让controller层的bean被SpringMVC加载控制很轻易做到。——控制SpringMVC加载的bean对应包位于对应的本身项目的controller目录下即可。
  

  
  <2>Spring相干bean加载控制。(方法)

  

  • 让Spring只加载对应的业务bean、功能bean。而避免加载到SpringMVC管理的bean。
  • 方式一:Spring加载的bean设定扫描范围为com.xxx,再排除掉controller包内的bean。
  • 方式二:Spring加载的bean设定扫描范围为精准范围。就是扫描包设定每层的精确范围:com.xxx.service包、com.xxx.dao包等。
  • 方式三:不区分Spring与springMVC的情况,加载到同一个情况中。
  二、Spring配置类——bean加载控制。

   (1)方法一:设定精确范围。

  

  • 缩小具体包对应的范围。这样就不会扫描到SpringMVC管理的bean地点controller层中。
  <1>controller层。

  

  • ExampleController类。
  1. package com.hyl.controller;
  2. import org.springframework.stereotype.Controller;
  3. import org.springframework.web.bind.annotation.RequestMapping;
  4. import org.springframework.web.bind.annotation.ResponseBody;
  5. /**
  6. * 控制器类
  7. */
  8. //1.使用注解@Controller定义bean
  9. @Controller
  10. public class ExampleController {
  11.     /**
  12.      * 随机写一个处理请求的方法
  13.      * @return 字符串(模仿json数据)
  14.      */
  15.     //设置当前方法操作的访问路径
  16.     @RequestMapping("/save")
  17.     //设置当前操作的返回值类型(如何响应给客户端)
  18.     @ResponseBody
  19.     public String save(){
  20.         //方便测试查看运行结果。
  21.         System.out.println("exampleController save ...");
  22.         return "{'module':'springMVC'}";
  23.     }
  24. }
复制代码

  <2>Spring配置类。

  1. package com.hyl.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. //创建Spring的配置类
  5. //排除加载controller包对应bean,使controller层交给SpringMVC管理
  6. @Configuration
  7. @ComponentScan({"com.hyl.service","com.hyl.dao"})
  8. /*@ComponentScan("com.hyl")*/
  9. public class SpringConfig {
  10. }
复制代码

  <3>SpringMVC配置类。

  1. package com.hyl.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. //创建SpringMVC的配置类,加载controller包对应bean
  5. @Configuration
  6. @ComponentScan("com.hyl.controller")
  7. public class SpringMvcConfig {
  8. }
复制代码

  

  • 测试类。(App)
  1. package com.hyl.test;
  2. import com.hyl.config.SpringConfig;
  3. import com.hyl.controller.ExampleController;
  4. import org.junit.Test;
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  6. public class App {
  7.     @Test
  8.     public void test(){
  9.         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  10.         ExampleController exampleController = context.getBean(ExampleController.class);
  11.         System.out.println(exampleController);
  12.     }
  13. }
复制代码


  • 测试运行结果。无法获取controller层的对应bean。
  

  
  (2)方法二:直接扫描主包(com.xxx),再排除controller包。

  

  • 按住ctrl进入注解@ComponentScan查看其内部的可用属性。
  <1>排除过滤器(excludeFilters)与包罗过滤器(includeFilters)。

  

  
  <2>设置过滤规则(type)与过滤范例(classes)。

  

  • excludeFilters取值:注解@ComponentScan的Filter。
  

  
  

  • 属性type、classes根属地。
  

  
  

  • 过滤规则。分为很多个过滤计谋:FilterType.xxx。(包括按注解过滤规则、用户自界说过滤规则、正则过滤规则等等)
  

  

  • 过滤范例。当过滤规则设定为:按注解进行过滤时。就需要再手动指定需要过滤的注解是哪个范例(注解:@Controller),才气完成注解的过滤扫描。
  

  
  <3>最终的Spring配置类。

  

  • 简单说以上利用的目的:当Spring扫描整个包"com.xxx"下所有包时,需要按照注解排除扫描——注解@Controller下标明的bean。
  1. package com.hyl.config;
  2. import org.springframework.context.annotation.ComponentScan;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.context.annotation.FilterType;
  5. import org.springframework.stereotype.Controller;
  6. //创建Spring的配置类
  7. //排除加载controller包对应bean,使controller层交给SpringMVC管理
  8. @Configuration
  9. /*@ComponentScan({"com.hyl.service","com.hyl.dao"})*/
  10. @ComponentScan(value = "com.hyl",
  11.         excludeFilters = @ComponentScan.Filter(
  12.                 type = FilterType.ANNOTATION,
  13.                 classes = Controller.class
  14.         )
  15. )
  16. public class SpringConfig {
  17. }
复制代码


  • 测试类。
  1. package com.hyl.test;
  2. import com.hyl.config.SpringConfig;
  3. import com.hyl.controller.ExampleController;
  4. import org.junit.Test;
  5. import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  6. public class App {
  7.     @Test
  8.     public void test(){
  9.         AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
  10.         ExampleController exampleController = context.getBean(ExampleController.class);
  11.         System.out.println(exampleController);
  12.     }
  13. }
复制代码


  • 测试前需要将SpringMVC的配置类的注解@Configuration解释,否则即使在spring配置类中利用了注解拦截扫描,但最终还是会因为该注解自动将bean交给Spring容器管理。
  

  
  

  
  

  • 解释@Configuration后,继续获取Controller层的对应bean就会报错。
  • 为了既可以拦截注解生效,又可以让SpringMVC配置类被扫描到,可以将其提到上一级目录大概上上级目录即可。(如:放置com包下,不放在com.xxx下的某个目录)
  

  三、Web容器初始化配置类加载Spring情况。

   

  • 在SpringMVC的入门案例中。配置Tomcat运行的Web容器初识化启动配置类中,其时只配置了SpringMVC的情况。这次顺手将Spring的情况一起配置了。
  

  
  <1>方法createRootApplicationContext()。

  

  • createRootApplicationContext()方法作用就是配置Spring的情况,加载Spring配置类。
  • 与加载SpringMVC配置类的利用一模一样。不一样的地方就是修改:配置类.class。
  
  <2>Web容器配置类实现AbstractDispatcherServletInitializer类。(bean加载格式)

  

  • 这样当服务器启动时,不仅有SpringMVC容器,还有Spring容器。
  • createServletApplicationContext()——>加SpringMVC容器。
  • createRootApplicationContext()——>Spring容器。
  1. package com.hyl.config;
  2. import org.springframework.web.context.WebApplicationContext;
  3. import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
  4. import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;
  5. //定义一个Servlet容器启动的配置类,在里面加载SpringMVC的配置
  6. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
  7.     /**
  8.      *加载SpringMVC配置类
  9.      * @return
  10.      */
  11.     @Override
  12.     protected WebApplicationContext createServletApplicationContext() {
  13.         AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
  14.         webApplicationContext.register(SpringMvcConfig.class);
  15.         return webApplicationContext;
  16.     }
  17.     /**
  18.      *加载Spring配置类(加载Spring容器)
  19.      * @return
  20.      */
  21.     @Override
  22.     protected WebApplicationContext createRootApplicationContext() {
  23.         AnnotationConfigWebApplicationContext webApplicationContext = new AnnotationConfigWebApplicationContext();
  24.         webApplicationContext.register(SpringConfig.class);
  25.         return webApplicationContext;
  26.     }
  27.     /**
  28.      * 设置哪些请求归属SpringMVC处理
  29.      * @return
  30.      */
  31.     @Override
  32.     protected String[] getServletMappings() {
  33.         return new String[]{"/"};
  34.     }
  35. }
复制代码

  <3>实现类AbstractAnnotationConfigDispatcherServletInitializer 。(更简单利用)

  

  
  

  • 简化后的Web容器配置类。
  1. package com.hyl.config;
  2. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  3. //定义一个Servlet容器启动的配置类,在里面加载SpringMVC、Spring的配置
  4. public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
  5.     /**
  6.      *加载Spring配置类(加载Spring容器)
  7.      * @return
  8.      */
  9.     @Override
  10.     protected Class<?>[] getRootConfigClasses() {
  11.         return new Class[]{SpringConfig.class};
  12.     }
  13.     /**
  14.      *加载SpringMVC配置类
  15.      * @return
  16.      */
  17.     @Override
  18.     protected Class<?>[] getServletConfigClasses() {
  19.         return new Class[]{SpringMvcConfig.class};
  20.     }
  21.     @Override
  22.     protected String[] getServletMappings() {
  23.         return new String[]{"/"};
  24.     }
  25. }
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表