?
最近試著做了個(gè)springmvc 項(xiàng)目,在加入 發(fā)郵件 功能時(shí)遇到的問題。
Spring 通過注解獲取*.porperties文件的內(nèi)容,除了xml配置外,還可以通過@value方式來獲取。
@value是需要spring注解掃描的,所以要將spring注解掃描配置中加上實(shí)體類的包名路徑,實(shí)體類中也應(yīng)添加@Component
@Component??public?class?MailBean?{??????//實(shí)體類前加@Component?,讓spring掃描到該實(shí)體類,默認(rèn)是單例模式,該實(shí)體類的功能是從?data.properties?資源文件中讀取對(duì)應(yīng)的內(nèi)容??????@Value("#{configProperties['emailhost']}")??????private??String?emailHost;??????@Value("#{configProperties['emailform']}")??????private?String?emailFrom;??????@Value("#{configProperties['emailname']}")??????private?String?emailUsername;??????@Value("#{configProperties['emailpassword']}")??????private??String?emailPassword;??????public?String?getEmailHost()?{??????????return?emailHost;??????}????????????public?String?getEmailFrom()?{??????????return?emailFrom;??????}????????public?String?getEmailUsername()?{??????????return?emailUsername;??????}????????public?String?getEmailPassword()?{??????????return?emailPassword;??????}??
@Component
public class MailBean {//實(shí)體類前加@Component ,讓spring掃描到該實(shí)體類,默認(rèn)是單例模式,該實(shí)體類的功能是從 data.properties 資源文件中讀取對(duì)應(yīng)的內(nèi)容@Value("#{configProperties['emailhost']}")private String emailHost;@Value("#{configProperties['emailform']}")private String emailFrom;@Value("#{configProperties['emailname']}")private String emailUsername;@Value("#{configProperties['emailpassword']}")private String emailPassword;public String getEmailHost() {return emailHost;}public String getEmailFrom() {return emailFrom;}public String getEmailUsername() {return emailUsername;}public String getEmailPassword() {return emailPassword;}
spring配置文件部分代碼如下?
?
<!--?自動(dòng)掃描bugkiller包?,將帶有注解的類?納入spring容器管理?-->??<context:component-scan?base-package="com.myweb"></context:component-scan>????<!--?引入配置文件?-->??<bean?id="configProperties"?class="org.springframework.beans.factory.config.PropertiesFactoryBean">??????<property?name="locations">??????????<list>??????????<value>classpath:data.properties</value>??????????????<value>classpath:application.properties</value>??????????</list>??????</property>??</bean>??<bean?id="propertyConfigurer"?class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">??????<property?name="properties"?ref="configProperties"?/>??</bean>??
<!-- 自動(dòng)掃描bugkiller包 ,將帶有注解的類 納入spring容器管理 --><context:component-scan base-package="com.myweb"></context:component-scan><!-- 引入配置文件 --><bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"><property name="locations"><list><value>classpath:data.properties</value><value>classpath:application.properties</value></list></property></bean><bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"><property name="properties" ref="configProperties" /></bean>
資源文件內(nèi)容為
emailhost=郵箱的網(wǎng)關(guān)
emailname=你的用戶名
emailpassword=你的密碼
emailform=發(fā)件郵箱 ? //具體值需根據(jù)自身情況配置
這樣配置完了,從junit測(cè)試中可以正常取到 properties中配置的值
?
@Test??public?void?test(){??????????????ApplicationContext?appContext?=?new?ClassPathXmlApplicationContext("applicationContext.xml");?????????MailBean?connInfo?=?appContext.getBean(MailBean.class);?????????System.out.println(connInfo.getEmailHost());?????????System.out.println(connInfo.getEmailFrom());??
@Testpublic void test(){ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");MailBean connInfo = appContext.getBean(MailBean.class);System.out.println(connInfo.getEmailHost());System.out.println(connInfo.getEmailFrom());
?
<span?style="white-space:pre">????????</span>//可以正常獲取<span?style="white-space:pre">???</span>??????????System.out.println(connInfo.getEmailUsername());??????}??
<span style="white-space:pre"> </span>//可以正常獲取<span style="white-space:pre"> </span>System.out.println(connInfo.getEmailUsername());}
但一在具體業(yè)務(wù)中使用的時(shí)候get到的是null
后來發(fā)現(xiàn)原來我在業(yè)務(wù)中還是用的 new來創(chuàng)建的實(shí)體類 Mailbean ,但Mailbean ?已經(jīng)通過@Component 加入了Spring的管理中了,并且默認(rèn)的單例,直接new肯定是不對(duì)的 ,所以在業(yè)務(wù)中通過?
@Resource private MailBean mailBean; 注入進(jìn)來,當(dāng)然該業(yè)務(wù)類之前也要加注釋交給spring管理, 這樣就能成功的取到值了,在junit測(cè)試時(shí)是通過
?
MailBean?connInfo?=?appContext.getBean(MailBean.class);??
MailBean connInfo = appContext.getBean(MailBean.class);
獲取的bean,所以能正常取值,在業(yè)務(wù)中的話記得要通過@resource 注入進(jìn)來,不然是獲取不到該bean的奧,
另外在修改spring 配置文件時(shí),添加如下代碼時(shí)會(huì)拋出一些警告,說是沒有權(quán)限創(chuàng)建某些文件?
<bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
? ? ? ? <property name="locations">
? ? ? ? ? ? <list>
? ? ? ? ? ? <value>classpath:data.properties</value>
? ? ? ? ? ? ? ? <value>classpath:application.properties</value>
? ? ? ? ? ? </list>
? ? ? ? </property>
? ? </bean>
警告 :?Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKey 等等。。。
應(yīng)該實(shí)在寫入注冊(cè)表是權(quán)限不夠引起的 ,只需在命令窗口打開 regedit注冊(cè)表管理,在?HKEY_LOCAL_MACHINE\Software\JavaSoft\ ?下創(chuàng)建 Prefs項(xiàng)即可
總結(jié)
以上是生活随笔為你收集整理的springmvc通过@Value注解读取Properties配置文件的值,junit测试可以取到值,但是在业务中无法读取的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。