加载SpringMvcConfig执行@ComponentScan加载对应的bean加载UserController,每个@RequestMapping的名称对应一个具体的方法执行getServletMappings方法,定义所有的请求都通过SpringMVC单次请求过程:
- 发送请求localhost/save
- Web容器发现所有请求都经过SpirngMVC,将请求交给SpringMVC处理
- 解析请求路径/save
- 由/save匹配执行对应的方法save()
- 执行save()
- 检测到有@ResponseBody直接将save()方法的返回值作为响应求体返回给请求方
SpringMVC加载控制在学习SpringMVC之后,我们的Bean的范围逐渐变大:
- SpringMVC相关bean(表现层bean)
- Spring相关bean(业务层Service,功能DataSource等)
但是我们在使用时,需要区分相关bean的导入路径:
- SpringMVC加载的bean对应的包均在com.itheima.controller包内
- Spring加载的bean却包含有多个文件夹
因而我们给出两种方法来解决Spring的扫描问题:
- Spring加载的bean设定范围为com.itheima,并排除掉controller包内的bean
package com.itheima.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Controller;@Configuration/*@ComponentScan注解设置扫描范围@ComponentScan中包含有value,excludeFilters属性value:用于控制扫描范围excludeFilters:用于控制排除范围,需要采用@ComponentScan.Filter过滤器type:设置排除规则,当前使用按照bean定义时的注解类型进行排除classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean*/@ComponentScan(value="https://www.huyubaike.com/biancheng/com.itheima",excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class))public class SpringConfig {}/*这里做一个小补充内容:@ComponentScan中除了excludeFilters,还包括有includeFiltersincludeFilters:加载指定的bean,需要指定类型(type)和具体项(classes)*/
- Spring加载的bean设定范围为精准范围,例如service包,dao包等
package com.itheima.config;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.FilterType;import org.springframework.stereotype.Controller;@Configuration@ComponentScan({"com.itheima.service","com.itheima.dao"})public class SpringConfig {}
Servlet容器简化写法我们的Servlet容器中可以定义Spring和SpringMVC的配置文件
package com.itheima.config;import org.springframework.web.context.WebApplicationContext;import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer;public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {// 配置SpringMVC配置文件protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}// 配置Spring配置文件protected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);return ctx;}// 配置拦截路径protected String[] getServletMappings() {return new String[]{"/"};}}
我们可以注意到:
Spring和SpringMVC导入方法中均采用AnnotationConfigWebApplicationContext来创建对象
两者之间的区别仅仅是class包的不同
Spring给了我们一种新的继承类用于简化开发:
经验总结扩展阅读
-
-
-
2023年1月9日开造陵墓吉日一览表 2023年农历腊月十八开造陵墓吉日
-
-
-
-
-
《一千零一夜》:“世间的一切虚伪 人生无常,什么事都有可能发生,什么样的人都有可能遇见
-
2022年11月14日结婚好不好 2022年农历十月廿一结婚吉日
-
-
-
-
-
-
-
现象|欧洲上空怎么了?2000人看见远古人类,平行世界真的存在吗?
-
-
发型 发量少的阿姨别担心,新年学刘敏涛做这4款发型,时髦还显年轻
-
-