Spring加载属性文件方式(自动加载优先级问题)

目录
  • Spring加载属性文件
    • 方式1、用xml文件配置
    • 方式2、用注解
  • 对Spring加载顺序的理解
    • web.xml初始化
    • spring加载流程

Spring加载属性文件

方式1、用xml文件配置

正常情况下,spring整合mybatis的配置文件的dataSource部分如下

 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/ssm"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>

可以将数据库的链接信息写到属性文件中,如下。

jdbc.url=jdbc:mysql://localhost:3306/ssm
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root
jdbc.password=123456

在spring配置文件中,就可以用${}的形式获取属性信息,但需要加入 <context:property-placeholder />标签设置属性文件的路径。即

 <context:property-placeholder location="classpath:db.properties"/>    
 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
     <property name="driverClassName" value="${jdbc.driver}"></property>      
    <property name="url" value="${jdbc.url}"></property>
    <property name="username" value="${jdbc.username}"></property>
    <property name="password" value="${jdbc.password}"/>
 </bean>

但是由此会引发另一个问题,自动加载的优先级特别高(就是先实例化)

若org.mybatis.spring.SqlSessionFactoryBean的id为sqlSessionFactory,当自动注入时,org.mybatis.spring.mapper.MapperScannerConfigurer类下的SqlSessionFactory属性会自动注入,然后org.mybatis.spring.SqlSessionFactoryBean也会实例化,而org.mybatis.spring.SqlSessionFactoryBean中含有dateSourse,所以org.springframework.jdbc.datasource.DriverManagerDataSource也会实例化,但是这时属性文件还没有加载,造成程序出错Error setting property values,总而言之就是在属性文件加载之前,类实例化了,结果得不到属性文件中的值。

解决办法

第1步,更改org.mybatis.spring.SqlSessionFactoryBean的id名称,例如factory

第2步,将org.mybatis.spring.mapper.MapperScannerConfigurer中加入<property name="sqlSessionFactoryBeanName" value="factory"></property>,如果用<property name="sqlSessionFactory/>标签同样出现以上的问题。

因为自动注入只影响ref的,而sqlSessionFactoryBeanName的值的类型时string,用value赋值,所以不受影响

以下是完整的spring整合mybatis的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd" 
        default-autowire="byName">
        
      <context:property-placeholder location="classpath:db.properties"/>        
        <!-- 数据源封装类,数据源:获取数据库连接,spring-jdbc.jar中 -->
      <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
          <property name="driverClassName" value="${jdbc.driver}"></property>      
         <property name="url" value="${jdbc.url}"></property>
         <property name="username" value="${jdbc.username}"></property>
         <property name="password" value="${jdbc.password}"/>
      </bean>
        <!-- 创建SqlSessionFactory对象 -->
      <bean id="factory" class="org.mybatis.spring.SqlSessionFactoryBean">
          <!-- 数据库连接信息来源于dataSource -->
          <!-- <property name="dataSource" ref="dataSource"></property> -->
          <!-- 相当于mybatis中别名默认包 -->
          <property name="typeAliasesPackage" value="com.lee.pojo"></property>
      </bean>
      <!-- 扫描器相当于mybatis设置接口绑定时xml的mappers下的package标签 -->
      <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
          <!-- 扫描哪个包 -->
          <property name="basePackage" value="com.lee.mapper"></property>
          <!-- 和factory产生关系 -->       
      <property name="sqlSessionFactoryBeanName" value="factory"></property>
      </bean>     
</beans>

方式2、用注解

使用注解方法时,需要添加标签,这里的包名指的是含有注解的类所在包

<context:component-scan base-package="com.lee.service.impl"></context:component-scan>

测试的properties

my.value=hello

测试类

public class Demo{
    @Value("${my.value}")
    private String test;    
}

这样就可以实例化Demo时给test注入值

对Spring加载顺序的理解

web.xml初始化

  • Web项目启动的时候,容器(如:tomcat)读取webapp/WEB-INF/web.xml文件,读取和;
  • 创建ServletContex,Web项目所有部分都可以使用该上下文ServletContex;
  • 容器将解析为key-value对,并交给ServletContext;
  • 容器根据中的类创建监听实例,即启动监听;
  • listener监听类中会contextInitialized(ServletContextEvent servletContextEvent)初始化方法,可通过ServletContextEvent.getServletContext().getInitParameter(“field”)获得value的值;
  • 解析,并启动拦截器 拦截器开始起作用,当有请求进入时,执行Filter的doFilter方法;
  • 最后加载和初始化配置在load on startup的servlets;
  • 加载Spring,如果filter需要用到bean,但加载顺序是: 先加载filter 后加载spring,则filter中初始化操作中的bean为null.如果过滤器中要使用到 bean,可以将spring 的加载 改成Listener的方式:org.springframework.web.context.ContextLoaderListener

先创建上下文对象servletcontext,再加载监听器,然后去加载拦截器,最后加载servlet

路径问题:Spring MVC静态资源拦截(No mapping found for HTTP request with URI in DispatcherServlet with name ’ ')问题

/ 是加载视图配置的目录下的文件,前提是webapp下没有默认文件;如果有文件就访问默认文件

/* 我的测试是都报404

spring加载流程

启动先加载web.xml(包含:加载applicationContext.xml、listener:contextloadlistener、:DispatcherServlet),通过applicationContext.xml加载接口及java实现类、加载config.properties文件、加载数据库驱动等、加载mybatis.config文件(SqlSessionFactoryBean:加载xml文件)、加载数据库的接口和mapper.xml、加载springmvc视图等。

要保证install后mapper.java、mapper.xml要在同一文件下

如果用EL表达式(ModelAndView)时表达式出现问题解决如下:(搜索:SpringMVC中JSP页面不显示EL表达式的原因)

提高web.xml最上面dtd的版本

在jsp页面添加<%@ page isELIgnored=“false” %> ,添加head里就行

名称空间

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot 配置文件加载位置与优先级问题详解

    [1]项目内部配置文件 spring boot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件 –file:./config/ –file:./ –classpath:/config/ –classpath:/ 即如下图所示: 以上是按照优先级从高到低(1-4)的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置内容. SpringBoot会从这四个位置全部加载主配置文件,如果高优先级

  • SpringBoot配置加载,各配置文件优先级对比方式

    目录 1.SpringBoot配置文件 以设置应用端口为例 2.配置文件目录 3.自定义配置属性 自定义配置提示 4.指定配置文件 @PropertySource使用 装配yaml配置文件 @ImportResource使用 其他问题 idea使用*.properties文件出现中文乱码问题? 解决方法: 1.SpringBoot配置文件 SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件.支持properties后缀结尾的配置文件或者以yml/yaml后缀

  • 浅谈SpringBoot Bean加载优先级的问题

    目录 Bean加载优先级的问题 同一个类中加载顺序 @DependsOn控制顺序 @Order不能控制顺序 Spring控制Bean加载顺序 使用Spring @Order控制bean加载顺序 使用Spring @DependsOn控制bean加载顺序 小结一下 Bean加载优先级的问题 spring容器载入bean顺序是不确定的,spring框架没有约定特定顺序逻辑规范.但spring保证如果A依赖B(如beanA中有@Autowired B的变量),那么B将先于A被加载. 同一个类中加载顺序

  • springboot中的静态资源加载顺序优先级

    目录 springboot静态资源加载顺序优先级 看springboot源码里面 springboot静态资源加载规则 一.静态资源映射规则 1.webjars 2.springboot内置默认访问路径 3.首页处理 4.网站图标 springboot静态资源加载顺序优先级 看springboot源码里面 springboot静态资源加载规则 我们经常会使用springboot创建web应用,在springboot中金静态资源是如何存放的呢? 一.静态资源映射规则 我们先创建一个springbo

  • Spring加载属性文件方式(自动加载优先级问题)

    目录 Spring加载属性文件 方式1.用xml文件配置 方式2.用注解 对Spring加载顺序的理解 web.xml初始化 spring加载流程 Spring加载属性文件 方式1.用xml文件配置 正常情况下,spring整合mybatis的配置文件的dataSource部分如下  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"

  • Spring Web项目spring配置文件随服务器启动时自动加载

    前言:其实配置文件不随服务器启动时加载也是可以的,但是这样操作的话,每次获取相应对象,就会去读取一次配置文件,从而降低程序的效率,而Spring中已经为我们提供了监听器,可监听服务器是否启动,然后在启动时,加载spring的配置文件,并且只加载一次,从而提高程序效率. 实现:其配置需要在web.xml中进行,具体实现如下: <!--配置监听器 --> <!--以便在服务器启动的时候,加载spring配置文件--> <listener> <listener-clas

  • js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法

    页面滚动动态加载数据,页面下拉自动加载内容 相信很多人都见过瀑布流图片布局,那些图片是动态加载出来的,效果很好,对服务器的压力相对来说也小了很多 有手机的相信都见过这样的效果:进入qq空间,向下拉动空间,到底部时,会动态加载剩余的说说或者是日志 今天我们就来看看他们的实现思路和js控制动态加载的代码 下面的代码主要是控制滚动条下拉时的加载事件的 在下面代码说明出,写上你的操作即可,无论是加载图片还是加载记录数据  都可以 别忘了引用jquery类库 $(window).scroll(functi

  • 原生JS实现动态加载js文件并在加载成功后执行回调函数的方法

    本文实例讲述了原生JS实现动态加载js文件并在加载成功后执行回调函数的方法.分享给大家供大家参考,具体如下: 有的时候需要动态加载一个javascript文件,并且在加载成功后执行回调函数(例如文件中保存了json数据之类的).要实现这样的功能,可以使用<script> 元素的load 事件(IE9+.chrome.FireFox等)和onreadystatechange 事件(IE8以下),直接上代码: function loadScript(src, callback) { var scr

  • Spring Bean的属性注入方式

    在spring中bean的属性注入有两种 构造器注入 <bean id="car" class="nwtxxb.di.Car"> <constructor-arg index="0" type="java.lang.String" value="保时捷"></constructor-arg> <constructor-arg index="1"

  • Spring引入外部属性文件配置数据库连接的步骤详解

    直接配置数据库的信息 xml配置文件直接配置: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.sprin

  • 详解PHP文件的自动加载(autoloading)

    传统上,在PHP里,当我们要用到一个class文件的时候,我们都得在文档头部require或者include一下: <?php require_once('../includes/functions.php'); require_once('../includes/database.php'); require_once('../includes/user.php'); ... 但是一旦要调用的文档多了,就得每次都写一行,瞅着也不美观,有什么办法能让PHP文档自动加载呢? <?php func

  • Vue页面加载完成后如何自动加载自定义函数

    目录 页面加载完成后自动加载自定义函数 created mounted vue之自执行函数 页面加载完成后自动加载自定义函数 created 在模板渲染成html前调用,即通常初始化某些属性值,然后再渲染成视图. methods: {             indexs:function(){                 this.$http.post('{:url("Index/fun")}')                     .then(function(res){

  • Spring 注入static属性值方式

    目录 Spring 注入static属性值 1. 问题 2. 解决方案 Spring依赖注入static静态变量相关问题 1.Spring不支持依赖注入static静态变量 2.Spring如何给静态变量注入值 3.Spring静态注入的三种方式 去网上搜了下解决办法,简单总结一下几种实现方式 Spring 注入static属性值 本文介绍Spring中如何从属性文件给static字段注入值.实际应用中一些工具类中static属性值需读取配置文件,实现该功能可以让工具类提供静态方法更易使用. 1

  • PHP数组 为文章加关键字连接 文章内容自动加链接

    复制代码 代码如下: <?php $keys =array( array('网页特效','/js_a/js.html'), array('seo','/seo/seo.html'), array('php','/phper/php.html'), array('jsp','/jsp/jsp.html'), array('asp','/asp/asp.html'), array('ps','/fw/photo.html'), array('photoshop','/fw/photo.html'),

随机推荐