Sping+SpringMVC的框架中,IoC容器的加载过程:
-
基本上Web容器(如Tomcat)先加载ContextLoaderListener,然后生成一个IoC容器。
-
然后再实例化DispatchServlet时候会加载对应的配置文件,再次生成Controller相关的IoC容器。
关于上面两个容器关系:
ContextLoaderListener中创建ApplicationContext主要用于整个Web应用程序需要共享的一些组件,比如DAO,数据库的ConnectionFactory等。而由DispatcherServlet创建的ApplicationContext主要用于和该Servlet相关的一些组件,比如Controller、ViewResovler等。
对于作用范围而言,在DispatcherServlet中可以引用由ContextLoaderListener所创建的ApplicationContext,而反过来不行。
于是,如果对于这两份配置没有很好的认识,就会发生重复加载配置文件,导致bean被上述两个IoC容器重复加载。
参考:《
相同Bean分别被Spring MVC子容器与Spring父容器初始化,导致@Value注入失败
》
方法1. 通过在dispatcher-servlet.xml(applicationContext.xml)中配置exclude-filter
来避免重复加载的问题
<context:component-scan base-package="com.maijia.mq">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
方法2. 分开扫描,养成良好习惯:
-
applicationContext.xml <context:component-scan base-package="xx.xxx.xx.dao,xx.xx.xxx.service"/>
-
dispatcher-servlet.xml <context:component-scan base-package="xx.xx.xx.controller" />
问题描述Spring+SpringMVC启动后警告同一个bean注入了两次原因分析Sping+SpringMVC的框架中,IoC容器的加载过程:基本上Web容器(如Tomcat)先加载ContextLoaderListener,然后生成一个IoC容器。 然后再实例化DispatchServlet时候会加载对应的配置文件,再次生成Controller相关的IoC容器。关于上面两个...
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(RESTful API+redis).zip
完善的
Spring
+
SpringMVC
+Mybatis+easyUI后台管理系统(REST
文章目录前言一、代码结构二、使用步骤1.创建通用方法的实现类(InsertIgnore、InsertIgnoreBatch、Replace)2.MybatisPlus自定义SQL方法枚举3.创建自定义SQL
注入
器CustomerSqlInjector3.自定义基础CustomerMapper继承BaseMapper4.自定义基础Service继承IService及实现类5.增加或MybatisPlus
配置
类,
加载
自定义sql
注入
器总结
虽然MyBats-Plus的BaseMapper提供了非常好用,
对于contextConfigLocation参数,有2个地方可以
配置
:
1)context-param 是全局性
配置
2)servlet下的init-param 是局部性
配置
若以上两处都设置了一个相同的
bea
n
配置
文件路径,那么该文件内
配置
...
<dependency>
<groupId>cn.afterturn</groupId>
<artifactId>easypoi-
spring
-boot-starter</artifactId>
<version>4.0
默认情况下,
spring
在处理同一个ApplicationContext中名称相同的
bea
n时,分为两种情况处理:
1、如果两个
bea
n是在同一个
配置
文件中,那么
spring
会报错。
2、如果两个
bea
n是在不同的
配置
文件中,默认情况下,
spring
会覆盖先前的
bea
n。
在
配置
文件很多时,如果在启动时,对于同名的
bea
n
加载
没有异常信息,出现
问题
后会比较难以定位。
在
spring
中,处理
当通过接口的方式
注入
Bea
n时,如果有多个子类的
bea
n存在时,具体哪个
bea
n会被
注入
呢?系统中能否存在两个重名的
bea
n呢?如果可以,那么怎么选择引入呢?如果不行的话又该怎么避免上面的
问题
呢?
I. 多实例
Bea
n的选择
这个场景可以说是比较常见的,现在提倡面向接口编程嘛,当一个接口有多个实例时,怎么
注入
和引用就需要我们额外关注下了
基本使用姿势
首先定义一个接口和两个简单的实现类,并演示一下我们通常的用法
一个输出的接口定义如下
public interface IPrint {
void prin