Spring @Value注解失效问题解决方案

 更新时间:2020年04月08日 11:11:41   作者:Erneste  
这篇文章主要介绍了Spring @Value注解失效问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

项目使用的是SSM体系,spring的配置如下,配置没问题,因为我发现其他文件中的@Value可以使用,只有一处@Value失效了。

spring-servlet.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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:websocket="http://www.springframework.org/schema/websocket"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/aop
            http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
            http://www.springframework.org/schema/tx
            http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
            http://www.springframework.org/schema/websocket
            http://www.springframework.org/schema/websocket/spring-websocket.xsd">

  <context:property-placeholder ignore-unresolvable="true" location="classpath*:config.properties" />


  <!-- 使用Annotation自动注册Bean,Controllerller -->
  <context:component-scan base-package="com.magicmed.ecg" use-default-filters="false"> <!--base-package 如果多个,用“,”分隔-->
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  </context:component-scan>

  <!-- 自定义注解实现日志记录 -->
  <aop:aspectj-autoproxy />

  <mvc:annotation-driven />


  <import resource="classpath:mybatis-spring.xml" />
  <import resource="classpath:mail-spring.xml" />
  <import resource="classpath:rabbitmq-spring.xml" />

</beans>

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"
    xsi:schemaLocation="http://www.springframework.org/schema/context
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="propertyConfigurer"
     class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
    <property name="locations" >
      <list>
      </list>
    </property>
    <property name="ignoreUnresolvablePlaceholders" value="true" />
  </bean>


  <!-- 导入配置文件-->
  <import resource="classpath*:mybatis-spring.xml" />
  <import resource="classpath*:mail-spring.xml" />
  <import resource="classpath*:rabbitmq-spring.xml" />

</beans>

失效的@Value是Parser这个父类的一个属性上的注解,而Parser的两个子类Parser1与Parser2继承这个属性;我的目的就是先用Parser执行一定得判断逻辑——判断版本号,如果是版本1就用Parser1读取文件,如果是版本2就用Parser2读取文件。经过我的测试,我发现Parser使用fileRoot属性是不为null,也就是注入成功了,而Parser怎么也注入不成功,fileRoot的值为null。 代码如下:

// parse
@Component
public class Parser {

  @Value("${fileRoot}")
  protected String fileRoot;   //文件根路径


  protected String getFilePath(String appuserId, String uri) {
    return fileRoot + appuserId + System.getProperty("file.separator")+ uri;
  }


  public Map<String, String> getXML_version(String appuserId, String uri) {
    Element root = null;

    try {
      Document document = new SAXReader().read(new File(getFilePath(appuserId, uri) + ".xml"));
      root = document.getRootElement();  //获取根节点元素对象
    } catch (DocumentException e) {
      e.printStackTrace();
    }
    return root.element("XMLInfo").element("Version").getTextTrim();
  }


  public Map<String, Object> read_xml(String appuserId, String uri) {
    return null;
  }

}

// parser1
@Component
public class Parser1 extends Parser {
  
  @Override
  public Map<String, Object> read_xml(String appuserId, String uri) {
    try {
      InputStream in = new FileInputStream(new File(getFilePath(appuserId, uri) + ".xml"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    /**
     * 待处理的逻辑
     */
    return null;
  }

}


// parser2
@Component
public class Parser2 extends Parser {

  @Override
  public Map<String, Object> read_xml(String appuserId, String uri) {
    try {
      InputStream in = new FileInputStream(new File(getFilePath(appuserId, uri) + ".xml"));
    } catch (IOException e) {
      e.printStackTrace();
    }
    /**
     * 待处理的逻辑
     */
    return null;
  }

}
@Service
public class testServiceImpl implements testService {

  @Autowired
  private Parser parser;

  public Integer test(String id, String uri) {

    Map<String,String> versionMap = parser.getXML_version(id,uri);
    if(versionMap.get("mv").equals("1")){
      parser = new Parser1();
    }else if(versionMap.get("mv").equals("2")){
      parser = new Pparser2();
    }

    parser.read_xml(id,uri);

    return null;
  }

}

刚开始我也怀疑配置文件,也怀疑缓存的问题。后来我在网上查阅资料,找到这样一段话,茅塞顿开:

原因是如果有注入bean的那个类,在被其他类作为对象引用的话(被调用)。这个被调用的类也必须选择注解的方式,注入到调用他的那个类中,不能用 new出来做对象,new出来的对象再注入其他bean就会 发生获取不到的现象。所以要被调用的javabean,都需要@service,交给Spring去管理才可以,这样他就默认注入了。

于是我把代码改成如下形式,注入成功了。

@Service
public class testServiceImpl implements testService {
  @Autowired
  private Parser parser;
  @Autowired
  private Parser1 parser1;
  @Autowired
  private Parser2 parser2;
  public Integer test(String id, String uri) {
    Map<String,String> versionMap = parser.getXML_version(id,uri);
    if(versionMap.get("mv").equals("1")){
      parser = parser1;
    }else if(versionMap.get("mv").equals("2")){
      parser = parser2;
    }
    parser.read_xml(id,uri);
    return null;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java 数据结构与算法系列精讲之贪心算法

    Java 数据结构与算法系列精讲之贪心算法

    我们可能在好多地方都会听到贪心算法这一概念,并且它的算法思想也比较简单就是说算法只保证局部最优,进而达到全局最优。但我们实际编程的过程中用的并不是很多,究其原因可能是贪心算法使用的条件比较苛刻,所要解决的问题必须满足贪心选择性质
    2022-02-02
  • 超简单的java获取鼠标点击位置坐标的实例(鼠标在Jframe上的坐标)

    超简单的java获取鼠标点击位置坐标的实例(鼠标在Jframe上的坐标)

    在Java窗体Jframe上获取鼠标点击的坐标,其中使用了匿名内部类,实例代码非常简单易懂,大家可以学习一下
    2018-03-03
  • IntelliJ安装并使用Rust IDE插件

    IntelliJ安装并使用Rust IDE插件

    这篇文章主要介绍了IntelliJ安装并使用Rust IDE插件,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • JSON 与对象、集合之间的转换的示例

    JSON 与对象、集合之间的转换的示例

    在开发过程中,经常需要和别的系统交换数据,数据交换的格式有XML、JSON等,JSON作为一个轻量级的数据格式比xml效率要高,本篇文章主要介绍了JSON 与 对象 、集合 之间的转换,有兴趣的可以了解一下。
    2017-01-01
  • spring打包到jar包的问题解决

    spring打包到jar包的问题解决

    这篇文章主要给大家介绍了关于spring打包到jar包遇到的问题的解决方法,文中通过实例代码结束的非常详细,对大家的学习或者使用spring打包具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-08-08
  • Java包装类之自动装箱与拆箱

    Java包装类之自动装箱与拆箱

    这篇文章主要介绍了Java包装类之自动装箱与拆箱,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Struts2实现自定义拦截器的三种方式详解

    Struts2实现自定义拦截器的三种方式详解

    这篇文章主要介绍了Struts2实现自定义拦截器的三种方式详解,一些与系统逻辑相关的通用功能如权限的控制和用户登录控制等,需要通过自定义拦截器实现,本节将详细讲解如何自定义拦截器,需要的朋友可以参考下
    2023-07-07
  • Java如何防止JS脚本注入代码实例

    Java如何防止JS脚本注入代码实例

    这篇文章主要介绍了Java如何防止JS脚本注入代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java注解之Elasticsearch的案例详解

    Java注解之Elasticsearch的案例详解

    学会了技术就要使用,否则很容易忘记,因为自然界压根就不存在什么代码、变量之类的玩意,这都是一些和生活常识格格不入的东西。这篇文章主要介绍了Java中Elasticsearch的案例,感兴趣的可以了解一下
    2022-10-10
  • java中CopyOnWriteArrayList源码解析

    java中CopyOnWriteArrayList源码解析

    为了将读取的性能发挥到极致,jdk中提供了CopyOnWriteArrayList类,下面这篇文章主要给大家介绍了关于java中CopyOnWriteArrayList源码解析的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02

最新评论