Spring @Value注解失效問題解決方案
項目使用的是SSM體系,spring的配置如下,配置沒問題,因為我發(fā)現(xiàn)其他文件中的@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>
<!-- 自定義注解實現(xiàn)日志記錄 -->
<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>
<!-- 導(dǎo)入配置文件-->
<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執(zhí)行一定得判斷邏輯——判斷版本號,如果是版本1就用Parser1讀取文件,如果是版本2就用Parser2讀取文件。經(jīng)過我的測試,我發(fā)現(xiàn)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(); //獲取根節(jié)點元素對象
} 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;
}
}
剛開始我也懷疑配置文件,也懷疑緩存的問題。后來我在網(wǎng)上查閱資料,找到這樣一段話,茅塞頓開:
原因是如果有注入bean的那個類,在被其他類作為對象引用的話(被調(diào)用)。這個被調(diào)用的類也必須選擇注解的方式,注入到調(diào)用他的那個類中,不能用 new出來做對象,new出來的對象再注入其他bean就會 發(fā)生獲取不到的現(xiàn)象。所以要被調(diào)用的javabean,都需要@service,交給Spring去管理才可以,這樣他就默認(rèn)注入了。
于是我把代碼改成如下形式,注入成功了。
@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;
}
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決IDEA中Maven依賴包導(dǎo)入失敗報紅問題(總結(jié)最有效8種解決方案)
這篇文章主要介紹了解決IDEA中Maven依賴包導(dǎo)入失敗報紅問題,本文通過圖文詳解給大家總結(jié)了最有效的8種解決方法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-07-07
關(guān)于Java中@SuppressWarnings的正確使用方法
這篇文章主要介紹了關(guān)于Java中@SuppressWarnings的正確使用方法,@SuppressWarnings注解主要用在取消一些編譯器產(chǎn)生的警告對代碼左側(cè)行列的遮擋,有時候這會擋住我們斷點調(diào)試時打的斷點,需要的朋友可以參考下2023-05-05
SSH框架網(wǎng)上商城項目第25戰(zhàn)之使用java email給用戶發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項目第25戰(zhàn)之使用java email給用戶發(fā)送郵件,感興趣的小伙伴們可以參考一下2016-06-06
Spring Bean創(chuàng)建和循環(huán)依賴
這篇文章主要介紹了Spring Bean創(chuàng)建和循環(huán)依賴,講述了Spring容器中?Bean?的創(chuàng)建過程已經(jīng)主要的方法,另外也著重分析了循環(huán)依賴的問題,需要的小伙伴可以參考一下2022-05-05

