Spring @Value注解失效問(wèn)題解決方案
項(xiàng)目使用的是SSM體系,spring的配置如下,配置沒(méi)問(wèn)題,因?yàn)槲野l(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自動(dòng)注冊(cè)Bean,Controllerller -->
<context:component-scan base-package="com.magicmed.ecg" use-default-filters="false"> <!--base-package 如果多個(gè),用“,”分隔-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 自定義注解實(shí)現(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這個(gè)父類(lèi)的一個(gè)屬性上的注解,而Parser的兩個(gè)子類(lèi)Parser1與Parser2繼承這個(gè)屬性;我的目的就是先用Parser執(zhí)行一定得判斷邏輯——判斷版本號(hào),如果是版本1就用Parser1讀取文件,如果是版本2就用Parser2讀取文件。經(jīng)過(guò)我的測(cè)試,我發(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é)點(diǎn)元素對(duì)象
} 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;
}
}
剛開(kāi)始我也懷疑配置文件,也懷疑緩存的問(wèn)題。后來(lái)我在網(wǎng)上查閱資料,找到這樣一段話,茅塞頓開(kāi):
原因是如果有注入bean的那個(gè)類(lèi),在被其他類(lèi)作為對(duì)象引用的話(被調(diào)用)。這個(gè)被調(diào)用的類(lèi)也必須選擇注解的方式,注入到調(diào)用他的那個(gè)類(lèi)中,不能用 new出來(lái)做對(duì)象,new出來(lái)的對(duì)象再注入其他bean就會(huì) 發(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;
}
}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
解決IDEA中Maven依賴包導(dǎo)入失敗報(bào)紅問(wèn)題(總結(jié)最有效8種解決方案)
這篇文章主要介紹了解決IDEA中Maven依賴包導(dǎo)入失敗報(bào)紅問(wèn)題,本文通過(guò)圖文詳解給大家總結(jié)了最有效的8種解決方法,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
關(guān)于Java中@SuppressWarnings的正確使用方法
這篇文章主要介紹了關(guān)于Java中@SuppressWarnings的正確使用方法,@SuppressWarnings注解主要用在取消一些編譯器產(chǎn)生的警告對(duì)代碼左側(cè)行列的遮擋,有時(shí)候這會(huì)擋住我們斷點(diǎn)調(diào)試時(shí)打的斷點(diǎn),需要的朋友可以參考下2023-05-05
使用Java找出兩個(gè)List中的重復(fù)元素三種方法
在Java編程中,我們經(jīng)常需要找出兩個(gè)列表(List)中的重復(fù)元素,在本文中,我們將探討三種方法來(lái)實(shí)現(xiàn)這一目標(biāo),需要的朋友可以參考下2023-10-10
SSH框架網(wǎng)上商城項(xiàng)目第25戰(zhàn)之使用java email給用戶發(fā)送郵件
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xià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)建過(guò)程已經(jīng)主要的方法,另外也著重分析了循環(huán)依賴的問(wèn)題,需要的小伙伴可以參考一下2022-05-05

