2010-08-12 35 views
20

Làm thế nào tôi có thể tiêm một tập tin thuộc tính có chứa một bản đồ được sử dụng như bổ sung constructor arg bằng cách sử dụng lĩnh vực này.Populating một bean mùa xuân bằng cách sử dụng một constructor-arg lĩnh vực

Với một bản đồ được nạp từ một thuộc tính tập tin

đậu hiện đang thiết lập sử dụng:

<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 tương đương:

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

Cảm ơn

Trả lời

32

Something như thế này:

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

này có lợi thế của the ability to create beans using arbitrary static factory methods, trong trường hợp này sử dụng loadConfigurations() như phương pháp nhà máy để tạo hạt configuration, sau đó được đưa vào công cụ xây dựng thích hợp của EmbeddedGraphDatabase.

+3

Cảm ơn bạn skaffman, nó hoạt động hoàn hảo :) – patrickandroid

+1

Tôi đã thêm điều này vào [Neo4j wiki] (http://wiki.neo4j.org/content/Spring_And_Neo4j#Configuring_Neo4j_settings_in_Spring) cũng vậy, cảm ơn các bạn! – nawroth

+0

@skaffman +1 Cảm ơn !! Bạn có thể vui lòng thêm câu trả lời bằng cách sử dụng chú thích không ?? –

8

Tạo đậu tải các thuộc tính (và lấy tên tệp làm đối số) và thay vào đó hãy chèn tên.

EDIT Khi sử dụng chú thích, những thứ như constructor injection trở nên đơn giản hơn:

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

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

Lưu ý rằng phương pháp định nghĩa bean thứ hai "đơn giản là" gọi đầu tiên. Khi mã này được thực hiện, Spring sẽ thực hiện một số phép thuật để bạn vẫn có thể ghi đè lên bean ở đâu đó (nghĩa là bean vẫn ghi đè lên nhau) và nó sẽ đảm bảo rằng thân phương thức sẽ chỉ được thực thi một lần (bất kể tần suất và vị trí của nó) được gọi là).

Nếu cấu hình là trong một lớp học khác nhau @Configuration, sau đó bạn có thể @Autowired nó:

@Autowired 
private Map<String,String> configuration; 

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

Bạn có thể thêm câu trả lời bằng cách sử dụng chú thích không ?? –

+0

@KanagaveluSugumar: Xong. –

+0

Cảm ơn bạn rất nhiều !!, tôi đã nêu ra câu hỏi phụ dựa trên câu trả lời của bạn. http://stackoverflow.com/questions/20210307/sping-annotations-how-to-create-autowire-annotation-for-static-method-with-argu –

Các vấn đề liên quan