Spring MVC Bean加载控制

news/2024/11/17 15:44:39/

回顾一下我们一般写的项目包括那些包吧:

  • config目录存入的是配置类,写过的配置类有:
    • ServletContainersInitConfig
    • SpringConfig
    • SpringMvcConfig
    • JdbcConfig
    • MybatisConfig
  • controller目录存放的是SpringMVC的controller类
  • service目录存放的是service接口和实现类
  • dao目录存放的是dao/Mapper接口

bean加载控制

众所周知controller、service和dao这些类都需要被容器管理成bean对象:

  • SpringMVC加载其相关bean(表现层bean),也就是controller包下的类
  • Spring控制的bean
    • 业务bean(Service)
    • 功能bean(DataSource,SqlSessionFactoryBean,MapperScannerConfigurer等)

如下图所示:
示例图

其实很简单我们只需要在SpringMVC的配置类SpringMvcConfig中使用注解@ComponentScan,我们只需要将其扫描范围设置到controller即可

在这里插入图片描述

但是新的问题出现了,因为在Spring的配置类SpringConfig中使用注解@ComponentScan,当时扫描的范围中其实是已经包含了controller
在这里插入图片描述

从包结构来看的话,Spring已经多把SpringMVC的controller类也给扫描到,所以因为功能不同,如何避免Spring错误加载到SpringMVC的bean我们继续往下看。

具体操作

解决那个我们我们很容易想到方案:加载Spring控制的bean的时候排除掉SpringMVC控制的bean。

  • 方式一:Spring加载的bean设定扫描范围为精准范围,例如service包、dao包等
  • 方式二:Spring加载的bean设定扫描范围为com.itheima,排除掉controller包中的bean
  • 方式三:不区分Spring与SpringMVC的环境,加载到同一个环境中[我不会我跟的视频老师没讲,因为是初阶这里就不涉及了,后面想起来了我会重新回来填坑的]

我们举个例子看下,一下面项目结构为例:
在这里插入图片描述

先悄悄给大家搂一样解决方案
在这里插入图片描述

方案一

修改Spring配置类,设定扫描范围为精准范围。

@Configuration
@ComponentScan({"com.taro.service","com.taro.dao"})
public class SpringConfig {
}

当然这个例子说明可以精确指定让Spring扫描对应的包结构,真正在做开发的时候,Dao最终是交给MapperScannerConfigurer对象来进行扫描处理的,我们只需要将其扫描到service包即可。 当然现在还是推荐推荐推荐扫描一下的

方案二

方式二:修改Spring配置类,设定扫描范围为com.itheima,排除掉controller包中的bean

@Configuration
@ComponentScan(value="com.taro",excludeFilters=@ComponentScan.Filter(type = FilterType.ANNOTATION,classes = Controller.class)
)
public class SpringConfig {
}

还记得@Configuration注解嘛,我们之前提到过,他出现的类Spring在扫描时会扫描它并加载bean

@Configuration//这里这里这里
@ComponentScan("com.taro.controller")
public class SpringMvcConfig {
}

接下来就是介绍一下我们写的那些属性都是哈了:

  • excludeFilters属性:设置扫描加载bean时,排除的过滤规则
  • type属性:设置排除规则,当前使用按照bean定义时的注解类型进行排除
    • ANNOTATION:按照注解排除
    • ASSIGNABLE_TYPE:按照指定的类型过滤
    • ASPECTJ:按照Aspectj表达式排除,基本上不会用
    • REGEX:按照正则表达式排除
    • CUSTOM:按照自定义规则排除
  • classes属性:设置排除的具体注解类,当前设置排除@Controller定义的bean

当然,有了Spring的配置类,要想在tomcat服务器启动将其加载,我们需要修改ServletContainersInitConfig,还记得我们之前写的吗?

public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {protected WebApplicationContext createServletApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringMvcConfig.class);return ctx;}protected WebApplicationContext createRootApplicationContext() {AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();ctx.register(SpringConfig.class);return ctx;}protected String[] getServletMappings() {return new String[]{"/"};}}

既然氛围都到这里了,不整点简单的都不好意思了;

//web配置类简化开发,仅设置配置类类名即可
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {protected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}protected String[] getServletMappings() {return new String[]{"/"};}
}

直观的对比感受一下吧:
在这里插入图片描述
他俩是父子类哦。。。


http://www.ppmy.cn/news/46192.html

相关文章

Nacos系列-Nacos服务注册与发现

服务注册与发现 1.故事背景2.服务注册2.1服务注册原理2.2服务注册实现 3服务发现3.1 服务发现原理3.2 服务发现实现3.3 LoadBalanced注解 总结提升 1.故事背景 上文我们讲到了Nacos的配置中心&#xff0c;介绍了什么是Nacos的配置中心&#xff0c;以及它的相关概念和使用方法。…

动力节点Springsecurity笔记01-05认证入门

1 问题 如何保护我们的程序&#xff1f; 1.1 创建code目录 目的&#xff1a;后面的security工程均在此目录下学习 创建code目录&#xff0c;并使用idea打开 1.2 不使用安全框架的springboot web程序 1.2.1 新建子模块springboot-01-hello [外链图片转存失败,源站可能有防盗…

深入剖析 Qt QMultiMap :原理、应用与技巧

目录标题 引言QMultiMap 的基本用法接口的用途和实际应用场景综合示例展示QMultiMap的所有用法 迭代器&#xff1a;遍历 QMultiMap 中的元素&#xff08;Iterators: Traversing Elements in QMultiMap &#xff09;QMultiMap 的高级用法QMultiMap 的优点和局限性优点局限性 QMu…

一起读源码 —— Fastjson 的核心方法及其实现原理

源码介绍 Fastjson 是阿里巴巴开源的一个 Java 工具库&#xff0c;它常常被用来完成 Java 的对象与 JSON 格式的字符串的相互转化。 此文读的源码是撰写此文时 Fastjson 的最新的发布版本&#xff0c;即 1.2.83 下载源码 请前去 github 找到 release 最新版下载后解压&…

JUC源码系列-ReentrantLock独占锁的释放

前言 开始之前先提一句, JAVA的内置锁在退出临界区之后是会自动释放锁的, 但是ReentrantLock这样的显式锁是需要自己显式的释放的, 所以在加锁之后一定不要忘记在finally块中进行显式的锁释放: Lock lock new ReentrantLock(); ... lock.lock(); try {// 更新对象//捕获异常…

IOC容器——Bean

IOC容器——Bean Bean配置name别名属性Bean作用范围scopeBean的实例化构造方法示例化静态工厂实例化实例工厂与FactoryBean实例工厂FactoryBean bean的生命周期 Bean配置 name别名属性 Bean ID 唯一&#xff0c;而关于Spring别名&#xff0c;我们可以在配置文件中使用name来定…

《高等工程数学》各知识点解题思路梳理(基于AI模型)

《高等工程数学》各知识点解题思路梳理 **一、填空题****1.给定线性空间的一个基&#xff0c;求一给定向量在该基下的坐标****2. 给定欧氏空间的标准正交基&#xff0c;求一给定向量的长度****3.求给定矩阵的2-范数、无穷范数&#xff0c;1-范数****4.确定方阵幂级数收敛的条件…

COMSOL锂离子电池仿真技术与应用

背景&#xff1a; 随着各国燃油车禁售时间表的推出&#xff0c;新能源汽车的地位愈发稳固。而锂离子电池作为电动车的核心动力源&#xff0c;也越来越受到市场的追捧。锂离子电池在制作过程中涉及正极、电解液、负极、隔膜等材料的选取与匹配&#xff0c;极片设计参数的选择等…