![](/img/trans.png)
[英]Spring: Bean fails to read off values from external Properties file when using @Value annotation
[英]Spring: How to inject values with @Value annotation by reading from external properties file?
我有以下情况
- 有一个MongoService类,它从文件中读取主机,端口和数据库
xml配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>file:///storage/local.properties</value>
</list>
</property>
</bean>
</beans>
local.properties看起来像
### === MongoDB interaction === ###
host="127.0.0.1"
port=27017
database=contract
和MongoService类为
@Service
public class MongoService {
private final Mongo mongo;
private final String database;
private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class);
public MongoService(@Nonnull final @Value("#{ systemProperties['host']}") String host, @Nonnull final @Value("#{ systemProperties['port']}") int port, @Nonnull final @Value("#{ systemProperties['database']}") String db) throws UnknownHostException {
LOGGER.info("host=" + host + ", port=" + port + ", database=" + db);
mongo = new Mongo(host, port);
database = db;
}
}
当我想测试豆子没问题的时候,我会做以下几点
MongoServiceTest.java
public class MongoServiceTest {
@Autowired
private MongoService mongoService;
}
它抱怨说can not identify bean for MongoService
。
然后我将以下内容添加到上面的xml中
<bean id="mongoService" class="com.business.persist.MongoService"></bean>
然后它抱怨说"No Matching Constructor found"
我想做的事
a。)MongoService应该是@Autowired
并从<value>file:///storage/local.properties</value>
读取配置参数
题
a。)在构造函数中访问值是否正确? (file name is local.properties and I am using @Value("#{ systemProperties['host']}") syntax)
b。)我需要做什么才能使@Autowired private MongoService mongoService
正确加载并从local.properties文件中读取值。
PS我是Spring的新手,并不知道如何使这项工作
非常感谢您的帮助
我想,您必须将constructor-arg添加到config xml,如下所示。
<bean id="mongoService" class="com.business.persist.MongoService">
<constructor-arg type="java.lang.String">
<value>host</value>
</constructor-arg>
<constructor-arg type="int">
<value>port</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>database</value>
</constructor-arg>
</bean>
我不确定,Bst方式可以添加基于java的bean配置。 从xml中删除bean定义并添加基于java的congfig,如下所示
@Service
public class MongoService {
private final Mongo mongo;
private final String database;
private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class);
@bean
public MongoService(@Nonnull final @Value("#{ systemProperties['host']}") String host, @Nonnull final @Value("#{ systemProperties['port']}") int port, @Nonnull final @Value("#{ systemProperties['database']}") String db) throws UnknownHostException {
LOGGER.info("host=" + host + ", port=" + port + ", database=" + db);
mongo = new Mongo(host, port);
database = db;
}
}
HTH
默认情况下,Spring使用默认构造函数(没有args)实例化对象,然后使用setter方法设置所有属性。 如果你不想(或不能)使用setter或定义默认的construtor,你必须告诉spring传入什么作为构造函数args。
这是一篇博客文章,解释了如何完成它:
http://www.javalobby.org/java/forums/t18396.html
基本语法如下所示:
<bean name="MyBean" class="com.example.BeanClass">
<constructor-arg index="0"><ref bean="OtherBeanName"/></constructor-arg>
</bean>
index属性是可选的,但它要求您按照与constructor-arg
的params相同的顺序对XML constructor-arg
元素进行排序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.