12.2.1 配置 Spring Data Neo4j

配置 Spring Data Neo4j 的关键在于声明 GraphDatabaseService bean 和启用 Neo4j Repository 自动生成功能。如下的程序清单展现了 Spring Data Neo4j 所需的基本配置。

程序清单 12.8 使用 @EnableNeo4jRepositories 来配置 Spring Data Neo4j
package orders.config;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.neo4j.config.EnableNeo4jRepositories;
import org.springframework.data.neo4j.config.Neo4jConfiguration;

@Configuration
@EnableNeo4jRepositories(basePackages = "orders.db")
public class Neo4jConfig extends Neo4jConfiguration {

	public Neo4jConfig() {
		setBasePackage("orders");
	}

	@Bean(destroyMethod="shutdown")
	public GraphDatabaseService graphDatabaseService() {	
		return new GraphDatabaseFactory()
				.newEmbeddedDatabase("/tmp/graphdb");
	}
}

@EnableNeo4jRepositories 注解能够让 Spring Data Neo4j 自动生成 Neo4j Repository 实现。它的 basePackages 属性设置为 orders.db 包,这样它就会扫描这个包来查找(直接或间接)扩展 Repository 标记接口的其他接口。

Neo4jConfig 扩展自 Neo4jConfiguration,后者提供了多个便利的方法来配置 Spring Data Neo4j。在这些方法中,就包括 setBasePackage(),它会在 Neo4jConfig 的构造器中调用,用来告诉 Spring Data Neo4j 要在 orders 包中查找模型类。

这个拼图的最后一部分是定义 GraphDatabaseServicebean。在本例中,graphDatabaseService() 方法使用 GraphDatabaseFactory 来创建嵌入式的 Neo4j 数据库。在 Neo4j 中,嵌入式数据库不要与内存数据库相混淆。在这里,“嵌入式” 指的是数据库引擎与应用运行在同一个 JVM 中,作为应用的一部分,而不是独立的服务器。数据依然会持久化到文件系统中(在本例中,也就是 “/tmp/graphdb” 中)。

作为另外的一种方式,你可能会希望配置 GraphDatabaseService 连接远程的 Neo4j 服务器。如果 spring-data-neo4j-rest 库在应用的类路径下,那么我们就可以配置 SpringRestGraphDatabase,它会通过 RESTful API 来访问远程的 Neo4j 数据库:

@Bean(destroyMethod="shutdown")
public GraphDatabaseService grapthDatabaseService() {
  return new SpringRestGraphDatabser(
    "http://graphdbserver:7474/db/data/");
}

如上所示,SpringRestGraphDatabase 在配置时,假设远程的数据库并不需要认证。但是,在生产环境的配置中,当创建 SpringRestGraphDatabase 的时候,我们可能希望提供应用的凭证:

@Bean(destroyMethod="shutdown")
public GraphDatabaseService grapthDatabaseService(Enviroment env) {
  return new SpringRestGraphDatabser(
    "http://graphdbserver:7474/db/data/",
    env.getProperty("db.username"), env.getProperty("db.password"));
}

在这里,凭证是通过注入的 Environment 获取到的,避免了在配置类中的硬编码。 Spring Data Neo4j 同时还提供了 XML 命名空间。如果你更愿意在 XML 中配置 Spring Data Neo4j 的话,那可以使用该命名空间中的 <neo4j:config> 和 <neo4j:repositories> 元素。在功能上,程序清单 12.9 所展示的配置与程序清单 12.8 中的 Java 配置是相同的。

程序清单 12.9 Spring Data Neo4j 也可以通过 XML 来配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
  xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/neo4j
    http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd" >
  
  <neo4j:config storeDirectory="/tmp/graphdb" base-package="orders" />
  <neo4j:repositoried base-package="orders.db" />
</beans>

<neo4j:config> 元素配置了如何访问数据库的细节。在本例中,它配置 Spring Data Neo4j 使用嵌入式的数据库。具体来讲,storeDirectory 属性指定了数据要持久化到哪个文件系统路径中。base-package 属性设置了模型类定义在哪个包中。

至于 <neo4j:repositories> 元素,它启用 Spring Data Neo4j 自动生成 Repository 实现的功能,它会扫描 orders.db 包,查找所有扩展 Repository 的接口。

如果要配置 Spring Data Neo4j 访问远程的 Neo4j 服务器,我们所需要做的就是声明 SpringRestGraphDatabasebean,并设置 <neo4j:config> 的 graphDatabase-Service 属性:

 <neo4j:config base-package="orders" graphDatabaseService="graphDatabaseService" />
 <bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
   <constructor-arg value="http://graphserver:7474/db/data/" />
   <constructor-arg value="db.username" />
   <constructoe-arg value="db.password" />
 </bean>
 <neo4j:repositoried base-package="orders.db" />

不管是通过 Java 还是通过 XML 来配置 Spring Data Neo4j,我们都需要确保模型类位于基础包所指定的包中(通过 @EnableNeo4jRepositories 的 basePackages 属性 或 <neo4j:config> 的 base-package 属性来进行设置)。它们都需要使用注解将其标注为节点实体或关联关系实体。这就是我们接下来的任务。

Last updated