Spring Data Neo4j dramatically simplifies development, but some setup is naturally required. For building the application, Maven needs to be configured to include the Spring Data Neo4j dependencies, and configure the AspectJ weaving. After the build setup is complete, the Spring application needs to be configured to make use of Spring Data Neo4j.
Spring Data Neo4j projects can be built using maven, we also added means to build them with gradle and ant/ivy.
The necessary build plugin to build Spring Data Neo4j projects with gradle is available as part of the SDG distribution or on github which makes the usage as easy as:
Example 19.1. Gradle Build Configuration
sourceCompatibility = 1.6 targetCompatibility = 1.6 springVersion = "3.0.5.RELEASE" springDataNeo4jVersion = "2.0.0.RELEASE" aspectjVersion = "1.6.12.RELEASE apply from:'https://github.com/SpringSource/spring-data-neo4j/raw/master/build/ gradle/springdataneo4j.gradle' configurations { runtime testCompile } repositories { mavenCentral() mavenLocal() mavenRepo urls: "http://maven.springframework.org/release" }
The actual springdataneo4j.gradle is very simple just decorating the javac tasks with the iajc ant task.
The supplied sample ant build configuration is mainly about resolving the dependencies for Spring Data Neo4j and AspectJ using Ivy and integrating the iajc ant task in the build.
Example 19.2. Ant/Ivy Build Configuration
<taskdef resource="org/aspectj/tools/ant/taskdefs/aspectjTaskdefs.properties" classpath="${lib.dir}/aspectjtools.jar"/> <target name="compile" description="Compile production classes" depends="lib.retrieve"> <mkdir dir="${main.target}" /> <iajc sourceroots="${main.src}" destDir="${main.target}" classpathref="path.libs" source="1.6"> <aspectpath> <pathelement location="${lib.dir}/spring-aspects.jar"/> </aspectpath> <aspectpath> <pathelement location="${lib.dir}/spring-data-neo4j.jar"/> </aspectpath> </iajc> </target>
Spring Data Neo4j projects are easiest to build with Apache Maven. The main dependencies are: Spring Data Neo4j itself, Spring Data Commons, parts of the Spring Framework, and the Neo4j graph database.
The milestone releases of Spring Data Neo4j are available from the dedicated milestone repository. Neo4j releases and milestones are available from Maven Central.
Example 19.3. Spring milestone repository
<repository> <id>spring-maven-milestone</id> <name>Springframework Maven Repository</name> <url>http://maven.springframework.org/milestone</url> </repository>
The dependency on spring-data-neo4j
will transitively pull in the necessary parts of
Spring Framework (core, context, aop, aspects, tx), Aspectj, Neo4j, and Spring Data Commons. If you
already use these (or different versions of these) in your project, then include those dependencies
on your own.
Example 19.4. Maven dependencies
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-neo4j</artifactId> <version>2.0.0.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.12.RELEASE</version> </dependency>
Since Spring Data Neo4j uses AspectJ for build-time aspect weaving of entities, it is necessary to hook in the AspectJ Maven plugin to the build process. The plugin also has its own dependencies. You also need to explicitly specify the aspect libraries (spring-aspects and spring-data-neo4j).
Example 19.5. AspectJ configuration
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>aspectj-maven-plugin</artifactId> <version>1.2</version> <dependencies> <!-- NB: You must use Maven 2.0.9 or above or these are ignored (see MNG-2972) --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.6.12.RELEASE</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjtools</artifactId> <version>1.6.12.RELEASE</version> </dependency> </dependencies> <executions> <execution> <goals> <goal>compile</goal> <goal>test-compile</goal> </goals> </execution> </executions> <configuration> <outxml>true</outxml> <aspectLibraries> <aspectLibrary> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> </aspectLibrary> <aspectLibrary> <groupId>org.springframework.data</groupId> <artifactId>spring-datastore-neo4j</artifactId> </aspectLibrary> </aspectLibraries> <source>1.6</source> <target>1.6</target> </configuration> </plugin>
Users of Spring Data Neo4j have two ways of very concisely configuring it. Either they can use a Spring Data Neo4j XML configuration namespace, or they can use a Java-based bean configuration.
The XML namespace can be used to configure Spring Data Neo4j. The config
element
provides an XML-based configuration of Spring Data Neo4j in one line. It has three attributes.
graphDatabaseService
points out the Neo4j instance to use. For convenience,
storeDirectory
can be set instead of graphDatabaseService
to
point to a directory where a new EmbeddedGraphDatabase
will be created. For
cross-store configuration, the entityManagerFactory
attribute needs to be
configured.
Example 19.6. XML configuration with store directory
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 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-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j-2.0.xsd"> <context:annotation-config/> <neo4j:config storeDirectory="target/config-test"/> </beans>
Example 19.7. XML configuration with bean
<context:annotation-config/> <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase" destroy-method="shutdown"> <constructor-arg index="0" value="target/config-test" /> </bean> <neo4j:config graphDatabaseService="graphDatabaseService"/>
Example 19.8. XML configuration with cross-store
<context:annotation-config/> <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> <property name="dataSource" ref="dataSource"/> <property name="persistenceXmlLocation" value="classpath:META-INF/persistence.xml"/> </bean> <neo4j:config storeDirectory="target/config-test" entityManagerFactory="entityManagerFactory"/>
You can also configure Spring Data Neo4j using Java-based bean metadata.
For those not familiar with Java-based bean metadata in Spring, we recommend that you read up on it first. The Spring documentation has a high-level introduction as well as detailed documentation on it.
In order to configure Spring Data Neo4j with Java-based bean metadata, the class
Neo4jConfiguration
is registered with the context. This is either done
explicitly in the context configuration, or via classpath scanning for classes that
have the @Configuration annotation. The only thing that must be provided is the
GraphDatabaseService
. The example below shows how to register the
@Configuration Neo4jConfiguration
class, as well as Spring's
ConfigurationClassPostProcessor
that transforms the
@Configuration
class to bean definitions.
Example 19.9. Java-based bean configuration
<![CDATA[<beans ...> ... <tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/> <bean class="org.springframework.data.neo4j.config.Neo4jConfiguration"/> <bean class="org.springframework.context.annotation.ConfigurationClassPostProcessor"/> <bean id="graphDatabaseService" class="org.neo4j.kernel.EmbeddedGraphDatabase" destroy-method="shutdown" scope="singleton"> <constructor-arg index="0" value="target/config-test"/> </bean> ... </beans>