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

spring-servlet.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:mvc="http://www.springframework.org/schema/mvc"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:aop="http://www.springframework.org/schema/aop"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xmlns:websocket="http://www.springframework.org/schema/websocket"
  9. xsi:schemaLocation="http://www.springframework.org/schema/beans
  10. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  11. http://www.springframework.org/schema/mvc
  12. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  15. http://www.springframework.org/schema/aop
  16. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  17. http://www.springframework.org/schema/tx
  18. http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
  19. http://www.springframework.org/schema/websocket
  20. http://www.springframework.org/schema/websocket/spring-websocket.xsd">
  21.  
  22. <context:property-placeholder ignore-unresolvable="true" location="classpath*:config.properties" />
  23.  
  24. <!-- 使用Annotation自动注册Bean,Controllerller -->
  25. <context:component-scan base-package="com.magicmed.ecg" use-default-filters="false"> <!--base-package 如果多个,用“,”分隔-->
  26. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  27. </context:component-scan>
  28.  
  29. <!-- 自定义注解实现日志记录 -->
  30. <aop:aspectj-autoproxy />
  31.  
  32. <mvc:annotation-driven />
  33.  
  34. <import resource="classpath:mybatis-spring.xml" />
  35. <import resource="classpath:mail-spring.xml" />
  36. <import resource="classpath:rabbitmq-spring.xml" />
  37.  
  38. </beans>

spring.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/context
  5. http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans.xsd">
  7.  
  8. <bean id="propertyConfigurer"
  9. class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >
  10. <property name="locations" >
  11. <list>
  12. </list>
  13. </property>
  14. <property name="ignoreUnresolvablePlaceholders" value="true" />
  15. </bean>
  16.  
  17. <!-- 导入配置文件-->
  18. <import resource="classpath*:mybatis-spring.xml" />
  19. <import resource="classpath*:mail-spring.xml" />
  20. <import resource="classpath*:rabbitmq-spring.xml" />
  21.  
  22. </beans>

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

  1. // parse
  2. @Component
  3. public class Parser {
  4.  
  5. @Value("${fileRoot}")
  6. protected String fileRoot; //文件根路径
  7.  
  8. protected String getFilePath(String appuserId, String uri) {
  9. return fileRoot + appuserId + System.getProperty("file.separator")+ uri;
  10. }
  11.  
  12. public Map<String, String> getXML_version(String appuserId, String uri) {
  13. Element root = null;
  14.  
  15. try {
  16. Document document = new SAXReader().read(new File(getFilePath(appuserId, uri) + ".xml"));
  17. root = document.getRootElement(); //获取根节点元素对象
  18. } catch (DocumentException e) {
  19. e.printStackTrace();
  20. }
  21. return root.element("XMLInfo").element("Version").getTextTrim();
  22. }
  23.  
  24. public Map<String, Object> read_xml(String appuserId, String uri) {
  25. return null;
  26. }
  27.  
  28. }
  29.  
  30. // parser1
  31. @Component
  32. public class Parser1 extends Parser {
  33.  
  34. @Override
  35. public Map<String, Object> read_xml(String appuserId, String uri) {
  36. try {
  37. InputStream in = new FileInputStream(new File(getFilePath(appuserId, uri) + ".xml"));
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. /**
  42. * 待处理的逻辑
  43. */
  44. return null;
  45. }
  46.  
  47. }
  48.  
  49. // parser2
  50. @Component
  51. public class Parser2 extends Parser {
  52.  
  53. @Override
  54. public Map<String, Object> read_xml(String appuserId, String uri) {
  55. try {
  56. InputStream in = new FileInputStream(new File(getFilePath(appuserId, uri) + ".xml"));
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. /**
  61. * 待处理的逻辑
  62. */
  63. return null;
  64. }
  65.  
  66. }
  1. @Service
  2. public class testServiceImpl implements testService {
  3.  
  4. @Autowired
  5. private Parser parser;
  6.  
  7. public Integer test(String id, String uri) {
  8.  
  9. Map<String,String> versionMap = parser.getXML_version(id,uri);
  10. if(versionMap.get("mv").equals("1")){
  11. parser = new Parser1();
  12. }else if(versionMap.get("mv").equals("2")){
  13. parser = new Pparser2();
  14. }
  15.  
  16. parser.read_xml(id,uri);
  17.  
  18. return null;
  19. }
  20.  
  21. }

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

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

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

  1. @Service
  2. public class testServiceImpl implements testService {
  3.  
  4. @Autowired
  5. private Parser parser;
  6.  
  7. @Autowired
  8. private Parser1 parser1;
  9.  
  10. @Autowired
  11. private Parser2 parser2;
  12.  
  13. public Integer test(String id, String uri) {
  14.  
  15. Map<String,String> versionMap = parser.getXML_version(id,uri);
  16. if(versionMap.get("mv").equals("1")){
  17. parser = parser1;
  18. }else if(versionMap.get("mv").equals("2")){
  19. parser = parser2;
  20. }
  21.  
  22. parser.read_xml(id,uri);
  23.  
  24. return null;
  25. }
  26.  
  27. }

我遇到的Spring的@Value注解失效问题的更多相关文章

  1. Spring中@Translational注解失效场景

    今天面试被问到@Translational注解什么场景下失效,我一脸懵逼,说的恍恍惚惚的,下来我就总结一下@Translational注解失效的场景! @Transactional 注解相信大家并不陌 ...

  2. spring mvc 自动扫描注解失效原因

    关于spring自动扫描,在控制层,采用注解配置@Controller,项目能够成功启动,且无任何报错.但是 在进行页面跳转时,并未进行相应的拦截,整个界面只能在默认界面 ,跳转报404,由于楼主初次 ...

  3. Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效)

    Spring的Bean内部方法调用无法使用AOP切面(CacheAble注解失效) 前言 今天在使用Spring cache的Cacheable注解的过程中遇见了一个Cacheable注解失效的问题, ...

  4. Spring,SpringMvc配置常见的坑,注解的使用注意事项,applicationContext.xml和spring.mvc.xml配置注意事项,spring中的事务失效,事务不回滚原因

    1.Spring中的applicationContext.xml配置错误导致的异常 异常信息: org.apache.ibatis.binding.BindingException: Invalid ...

  5. spring事务注解失效问题

    问题描述: 由于工作需要,需要在spring中配置两个数据源,有一天突然发现@Transactional注解失效 环境框架: springmvc+spring+spring jdbcTemplate ...

  6. Spring aop注解失效

    问题 在spring 中使用 @Transactional . @Cacheable 或 自定义 AOP 注解时,对象内部方法中调用该对象的其他使用aop机制的方法会失效. @Transactiona ...

  7. SpringBoot @Async注解失效分析

    有时候在使用的过程中@Async注解会失效(原因和@Transactional注解有时候会失效的原因一样). 下面定义一个Service: 两个异步执行的方法test03()和test02()用来模拟 ...

  8. Spring Aop 动态代理失效分析

    1. Spring Aop 原理 Spring Aop 通过动态代理创建代理对象,在调用代理对象方法前后做增强. 2. Transactional, Async 注解失效? 当在动态代理方法中调用当前 ...

  9. Spring/SpringBoot常用注解总结

    转自:[Guide哥] 0.前言 可以毫不夸张地说,这篇文章介绍的 Spring/SpringBoot 常用注解基本已经涵盖你工作中遇到的大部分常用的场景.对于每一个注解我都说了具体用法,掌握搞懂,使 ...

随机推荐

  1. sublime 使用快捷键

    Goto Anything  快捷键 Ctrl+P (支持模糊匹配) 1,查找文件   在查找框中输入文件目录(知道目录直接输入目录,不知道目录直接输入页面名称即可.支持模糊匹配)  index.ht ...

  2. Web前端 页面功能——点击按钮返回顶部的实现方法

    1. 最简单的静态返回顶部,点击直接跳转页面顶部,常见于固定放置在页面底部返回顶部功能 方法一:用命名锚点击返回到顶部预设的id为top的元素 html代码 <a href="#top ...

  3. prufer序列笔记

    prufer序列 度娘的定义 Prufer数列是无根树的一种数列.在组合数学中,Prufer数列由有一个对于顶点标过号的树转化来的数列,点数为n的树转化来的Prufer数列长度为n-2. 对于一棵确定 ...

  4. C语言检测指定文件是否存在的代码

    内容之余,将做工程过程中比较常用的一些内容片段珍藏起来,下面资料是关于C语言检测指定文件是否存在的内容,希望能对小伙伴们有所用. #include <stdbool.h> #include ...

  5. java新知识系列 二

      1:数据库事务隔离以及事务隔离的级别 数据库事务隔离: 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别:为了解决更新丢失,脏读,不可重读(包括虚读和幻读)等问题在标准SQL规 ...

  6. Java 图片爬虫,java打包jar文件

    目录 1. Java 图片爬虫,制作 .jar 文件 spider.java 制作 jar 文件 添加执行权限 1. Java 图片爬虫,制作 .jar 文件 spider.java spider.j ...

  7. java实现Windows记事本

    给大家分享下我之前的作品: 源文件下载: 链接:https://pan.baidu.com/s/1N45VsS9aVgmvhvYjRLxBrA  提取码:b9fg  源码: JF_Notpad.jav ...

  8. aspnetcoremodule 2.1下载

    下载地址 or 云盘 aspnetcoremodule 2.1 页面地址 下载地址 云盘下载 链接:https://pan.baidu.com/s/1YKYzpP7E__yXQKpOVrN6nw 密码 ...

  9. git add 添加多个文件

    在使用git add提交多个文件的方式: git add .   后面加一个".",匹配所有的文件 总结下,提交多个文件时,git add后可以有如下参数以及参数的解释: git ...

  10. windows批处理添加AD域账户

    因为要用个批处理命令在Windows Server里面批量添加域用户,所以需要使用批处理命令. 我这篇是纯新手教程,在百度上搜了一些批处理命令感觉属于进阶教程,研究了两天才完成我要完成的目标. 下面从 ...