使用构造函数 arg 字段填充弹簧豆

2022-09-02 09:08:00

如何注入包含Map的属性文件,以使用字段用作附加构造函数arg。

从属性文件加载映射时

该 Bean 当前使用以下命令进行设置:

<bean id="graphDbService" class="org.neo4j.kernel.EmbeddedGraphDatabase"
     init-method="enableRemoteShell" destroy-method="shutdown">

     <constructor-arg index="0" value= "data/neo4j-db"/>
         <constructor-arg index="1" value=?  />
</bean>

Java Equivalent:

Map<String,String> configuration =  EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
GraphDatabaseService graphDb = new EmbeddedGraphDatabase( "data/neo4j-db", configuration );

谢谢


答案 1

像这样:

<bean id="configuration" class="org.neo4j.kernel.EmbeddedGraphDatabase" 
      factory-method="loadConfigurations">
   <constructor-arg value="neo4j_config.props"/>
</bean>

<bean id="graphDbService" class="org.neo4j.kernel.EmbeddedGraphDatabase"
     init-method="enableRemoteShell" destroy-method="shutdown">

     <constructor-arg index="0" value="data/neo4j-db"/>
     <constructor-arg index="1" ref="configuration"  />
</bean>

这利用了使用任意静态工厂方法创建Bean的能力,在这种情况下,使用作为工厂方法来创建Bean,然后将其注入到正确的构造函数中。loadConfigurations()configurationEmbeddedGraphDatabase


答案 2

创建一个加载属性的 Bean(并将文件名作为参数)并注入该 bean。

编辑使用注释时,构造函数注入之类的事情变得更加简单:

@Bean
public Map<String,String> configuration() {
    return EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
}

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration() );
}

请注意,第二个 Bean 定义方法“简单地”调用第一个。当执行此代码时,Spring将执行一些魔术,因此您仍然可以在其他地方覆盖bean(即bean仍然相互覆盖),并且它将确保方法体仅执行一次(无论调用的频率和位置如何)。

如果配置位于其他类中,则可以:@Configuration@Autowired

@Autowired
private Map<String,String> configuration;

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}

推荐