使用非基本类型配置Spring Bean XML(java.nio.file.Path)

时间:2014-07-21 22:22:07

标签: java spring

我可以使用原始值(如String / int / long / etc)配置Spring bean。如何使以下工作:

<?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/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean class="springtest.SomeBeanTest">
        <constructor-arg index="0" type="java.nio.file.Path" value="/Users/admin/test.txt"/>
    </bean>
</beans>

更新:以下工作。第二个varargs参数需要空列表。

<bean class="springtest.SomeBeanPath">
    <constructor-arg index="0">
        <bean class="java.nio.file.Paths" factory-method="get">
            <constructor-arg index="0" value="/Users/admin/test.txt" />
            <constructor-arg index="1"><list></list></constructor-arg>
        </bean>
    </constructor-arg>
</bean>

2 个答案:

答案 0 :(得分:2)

bean定义XML语法几乎可以实现任何类。

您可以在此处查看Spring文档以获取完整参考: http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-class,我从中提取了以下样本。

例如,您可以通过以下方式使用空构造函数实例化任何类:

<bean id="exampleBean" class="examples.ExampleBean"/>

如果构造函数是静态方法,则可以这样调用

<bean id="clientService"
class="examples.ClientService" factory-method="createInstance"/>

如果需要使用参数调用构造函数,请查看: http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#beans-constructor-injection

<bean id="foo" class="x.y.Foo">
    <constructor-arg ref="bar"/>
    <constructor-arg ref="baz"/>
</bean>

barbaz应该是其他春豆的ID。相反,如果使用XML属性value,则可以直接使用基本类型。 例如:

<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateanswer" value="42"/>
</bean>

您也可以先选择调用空构造函数,然后选择调用bean上的调用setter(或混合使用这两种方法)。

<bean id="exampleBean" class="examples.ExampleBean">
<!-- setter injection using the nested <ref/> element -->
<property name="beanOne"><ref bean="anotherExampleBean"/></property>

<!-- setter injection using the neater ref attribute -->
<property name="beanTwo" ref="yetAnotherBean"/>
<property name="integerProperty" value="1"/>
</bean>

有非常高级的配置选项,允许您覆盖Spring解释XML以解释ref / value属性的方式。 地图,列表还有一个专用语法...... 一种名为Spring-EL的表达式语言,您可以在XML中的运行时使用它进行动态评估。 加上各种前/后处理器选项,适用于更高级的场景(BeanFactoryAware,BeanFactoryPostProcessor,...)

因此,在您的情况下,您可以尝试像这样分解:

<bean class="springtest.SomeBeanTest">
    <constructor-arg index="0">
        <bean class="java.nio.file.Paths" factory-method="get">
           <constructor-arg index="0" value="your path" />
           <!-- Edit: see @clay's edit to the question, the following is necessary too -->
           <constructor-arg index="1"><list></list></constructor-arg>
        </bean>
    </constructor-arg>
</bean>

请注意,如果没有歧义,则不需要index属性。

答案 1 :(得分:0)

从配置文件中传递String并将String转换为SomeBeanTest类中的Path

您可以使用Paths类:

public class SomeBeanTest(){
     public SomeBeanTest(String textPath){
         Path path = Paths.get(textPath); // String to Path
     }
}

XML:

<bean class="springtest.SomeBeanTest">
    <constructor-arg value="/Users/admin/test.txt"/>
</bean>

注意:假设从类路径直接访问Users/admin/test.txt

了解更多Create a Path from String in Java7