中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring @Value注解失效問題解決方案

發布時間:2020-10-08 21:17:28 來源:腳本之家 閱讀:471 作者:Erneste 欄目:編程語言

項目使用的是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;
  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

奉贤区| 余姚市| 西丰县| 礼泉县| 阳原县| 洞头县| 辽宁省| 裕民县| 永川市| 仙游县| 怀来县| 苍溪县| 南漳县| 泽州县| 将乐县| 夹江县| 当雄县| 林西县| 桂东县| 旺苍县| 隆子县| 微博| 资溪县| 红河县| 金平| 房山区| 阳城县| 中西区| 峨山| 子洲县| 南昌县| 双峰县| 平陆县| 邯郸市| 甘德县| 岳普湖县| 城步| 泽库县| 信丰县| 阜新| 黄山市|