springmvc通过@Value注解读取Properties配置文件的值,junit测试可以取到值,但是在业务中无法读取

 

最近试着做了个springmvc 项目,在加入 发邮件 功能时遇到的问题。

Spring 通过注解获取*.porperties文件的内容,除了xml配置外,还可以通过@value方式来获取。

@value是需要spring注解扫描的,所以要将spring注解扫描配置中加上实体类的包名路径,实体类中也应添加@Component

  1. @Component  
  2. public class MailBean {  
  3.     //实体类前加@Component ,让spring扫描到该实体类,默认是单例模式,该实体类的功能是从 data.properties 资源文件中读取对应的内容  
  4.     @Value("#{configProperties['emailhost']}")  
  5.     private  String emailHost;  
  6.     @Value("#{configProperties['emailform']}")  
  7.     private String emailFrom;  
  8.     @Value("#{configProperties['emailname']}")  
  9.     private String emailUsername;  
  10.     @Value("#{configProperties['emailpassword']}")  
  11.     private  String emailPassword;  
  12.     public String getEmailHost() {  
  13.         return emailHost;  
  14.     }  
  15.       
  16.     public String getEmailFrom() {  
  17.         return emailFrom;  
  18.     }  
  19.   
  20.     public String getEmailUsername() {  
  21.         return emailUsername;  
  22.     }  
  23.   
  24.     public String getEmailPassword() {  
  25.         return emailPassword;  
  26.     }  
@Component
public class MailBean {
	//实体类前加@Component ,让spring扫描到该实体类,默认是单例模式,该实体类的功能是从 data.properties 资源文件中读取对应的内容
	@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配置文件部分代码如下 

 

  1. <!-- 自动扫描bugkiller包 ,将带有注解的类 纳入spring容器管理 -->  
  2. <context:component-scan base-package="com.myweb"></context:component-scan>  
  3.   
  4. <!-- 引入配置文件 -->  
  5. <bean id="configProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">  
  6.     <property name="locations">  
  7.         <list>  
  8.         <value>classpath:data.properties</value>  
  9.             <value>classpath:application.properties</value>  
  10.         </list>  
  11.     </property>  
  12. </bean>  
  13. <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">  
  14.     <property name="properties" ref="configProperties" />  
  15. </bean>  
    <!-- 自动扫描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>

资源文件内容为

emailhost=邮箱的网关
emailname=你的用户名
emailpassword=你的密码
emailform=发件邮箱   //具体值需根据自身情况配置

这样配置完了,从junit测试中可以正常取到 properties中配置的值

 

  1. @Test  
  2. public void test(){  
  3.      
  4.        ApplicationContext appContext = new ClassPathXmlApplicationContext("applicationContext.xml");  
  5.        MailBean connInfo = appContext.getBean(MailBean.class);  
  6.        System.out.println(connInfo.getEmailHost());  
  7.        System.out.println(connInfo.getEmailFrom());  
	@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());

 

  1. <span style="white-space:pre">        </span>//可以正常获取<span style="white-space:pre">   </span>  
  2.         System.out.println(connInfo.getEmailUsername());  
  3.     }  
<span style="white-space:pre">		</span>//可以正常获取<span style="white-space:pre">	</span>
        System.out.println(connInfo.getEmailUsername());
    }

但一在具体业务中使用的时候get到的是null

后来发现原来我在业务中还是用的 new来创建的实体类 Mailbean ,但Mailbean  已经通过@Component 加入了Spring的管理中了,并且默认的单例,直接new肯定是不对的 ,所以在业务中通过 
@Resource private MailBean mailBean; 注入进来,当然该业务类之前也要加注释交给spring管理, 这样就能成功的取到值了,在junit测试时是通过

 

  1. MailBean connInfo = appContext.getBean(MailBean.class);  
 MailBean connInfo = appContext.getBean(MailBean.class);

获取的bean,所以能正常取值,在业务中的话记得要通过@resource 注入进来,不然是获取不到该bean的奥,

另外在修改spring 配置文件时,添加如下代码时会抛出一些警告,说是没有权限创建某些文件 

<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 等等。。。

应该实在写入注册表是权限不够引起的 ,只需在命令窗口打开 regedit注册表管理,在 HKEY_LOCAL_MACHINE\Software\JavaSoft\  下创建 Prefs项即可

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值