3

我有以下情况
- 有一个 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;
    }
}

当我想测试该 bean 是否正常时,我在
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很陌生,真的不知道如何使这项工作

非常感谢您提前提供的帮助

4

2 回答 2

2

我认为,您必须将构造函数参数添加到配置 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 的配置如下

@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;
    }
}

高温高压

于 2012-06-29T19:25:00.203 回答
0

默认情况下,Spring 使用默认构造函数(没有参数)实例化对象,然后使用 setter 方法设置所有属性。如果您不想(或不能)使用 setter 或定义默认构造函数,则必须告诉 spring 要作为构造函数参数传入的内容。

这是一篇博客文章,解释了如何做到这一点:
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与构造函数的参数相同的顺序对 XML 元素进行排序。

于 2012-06-29T19:07:07.627 回答