spring 配置文件被加载两次

如下web.xml示例:

1.用spring的配置加载contextConfigLocation

2.配置spring-mvc的contextConfigLocation

 

<servlet>
    <servlet-name>spring-mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring/spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>spring-mvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring/spring-*.xml</param-value>
  </context-param>

 

看了配置,spring下面的文件在springmvc中加载了一次,在context中又加载了一次。

从启动日志和启动时长可以看到。 补充:重复加载还会导致配置的task,schadule任务重复执行!

所以,合理的做法是,把spring-mvc的定义单独摘出来定义在web容器启动的时候加载,名称也换成servlet-mvc.xml避免被spring重复加载, 而在spring的core xml定义中,不要出现mvc的东东

<servlet>  
    <servlet-name>spring-mvc</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <!--查找controller位置的xml文件配置 -->  
    <init-param>  
        <param-name>contextConfigLocation</param-name>  
        <!--查找这里可以配置多个,用逗号分割或者用通配符*也就是第二行 -->  
        <param-value>/WEB-INF/classes/servlet-mvc.xml</param-value>  
    </init-param>  
    <load-on-startup>1</load-on-startup>  
    <async-supported>true</async-supported>  
</servlet>  

 

springmvc的xml单独配置出来,spring本身管spring的,springmvc管springmvc的,这样就ok了

 

总结:该分开配置的不要合在一起。注意代码使用

 

转载于:https://www.cnblogs.com/huzi007/p/7895577.html

在 MyBatis 中实现动态切换数据源主要有两种方法:一种是使用多个 SqlSessionFactory 实例,每个实例对应一个数据源;另一种是在一个 SqlSessionFactory 实例中动态切换数据源。下面分别介绍这两种方法的实现。 #### 方法一:使用多个 SqlSessionFactory 实例 在 Spring 配置文件中定义多个 SqlSessionFactory 实例,每个实例对应一个数据源,例如: ```xml <bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db1"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db2"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="sqlSessionFactory1" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource1"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property name="databaseIdProvider" ref="databaseIdProvider"/> </bean> <bean id="sqlSessionFactory2" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource2"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property name="databaseIdProvider" ref="databaseIdProvider"/> </bean> <bean id="databaseIdProvider" class="org.mybatis.spring.boot.autoconfigure.DatabaseIdProviderAdapter"> <property name="properties"> <value> MySQL: mysql </value> </property> </bean> ``` 然后在代码中根据需要选择对应的 SqlSessionFactory 实例,例如: ```java @Autowired @Qualifier("sqlSessionFactory1") private SqlSessionFactory sqlSessionFactory1; @Autowired @Qualifier("sqlSessionFactory2") private SqlSessionFactory sqlSessionFactory2; public void doSomething(boolean useDataSource1) { SqlSessionFactory sqlSessionFactory = useDataSource1 ? sqlSessionFactory1 : sqlSessionFactory2; SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 使用 sqlSession 执行 SQL } finally { sqlSession.close(); } } ``` #### 方法二:在一个 SqlSessionFactory 实例中动态切换数据源 在 Spring 配置文件中定义一个 SqlSessionFactory 实例,然后在代码中动态切换数据源。具体实现方式如下: 首先在 Spring 配置文件中定义 dataSource 和 SqlSessionFactory 实例: ```xml <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/db1"/> <property name="username" value="root"/> <property name="password" value="password"/> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="mapperLocations" value="classpath:mapper/*.xml"/> <property name="databaseIdProvider" ref="databaseIdProvider"/> </bean> <bean id="databaseIdProvider" class="org.mybatis.spring.boot.autoconfigure.DatabaseIdProviderAdapter"> <property name="properties"> <value> MySQL: mysql </value> </property> </bean> ``` 然后在代码中使用 ThreadLocal 存储当前数据源的名称,在执行 SQL 之前根据当前数据源名称动态修改 SqlSessionFactory 中的 databaseId 属性,例如: ```java @Autowired private SqlSessionFactory sqlSessionFactory; private static final ThreadLocal<String> dataSourceName = new ThreadLocal<>(); public static void setDataSourceName(String name) { dataSourceName.set(name); } public static void clearDataSourceName() { dataSourceName.remove(); } public void doSomething() { String name = dataSourceName.get(); if (name == null) { throw new IllegalStateException("Data source name is not set."); } try (SqlSession sqlSession = sqlSessionFactory.openSession()) { Configuration configuration = sqlSession.getConfiguration(); configuration.setDatabaseId(name); // 使用 sqlSession 执行 SQL } finally { clearDataSourceName(); } } ``` 上述代码中,setDataSourceName() 方法用于设置当前数据源的名称,clearDataSourceName() 方法用于清除当前数据源的名称。在执行 SQL 之前,首先从 ThreadLocal 中获取当前数据源的名称,然后根据名称修改 SqlSessionFactory 中的 databaseId 属性,最后使用 SqlSession 执行 SQL。注意使用完毕后需要清除当前数据源的名称,否则可能会影响后续的 SQL 执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值