Spring 3 Java Config Example
With this example we are going to demonstrate how to use Spring 3.2.3 Java Configuration. Java Configuration provides a pure-Java means of configuring the Spring container. By taking advantage of Java language features such as annotations and generics, Java Configuration allows users to express configuration logic and metadata directly in code, alleviating any need for XML. With Java Configuation, bean definition and Spring configuration is moved out of XML configuration file into a Java class.
A @Configuration
annotated class consists of @Bean
annotated methods that define instantiation, configuration, and initialization logic for objects to be managed by the Spring IoC container.
Our preferred development environment is Eclipse. We are using Eclipse Juno (4.2) version, along with Maven Integration plugin version 3.1.0. You can download Eclipse from here and Maven Plugin for Eclipse from here. The installation of Maven plugin for Eclipse is out of the scope of this tutorial and will not be discussed. We are also using Spring version 3.2.3 and the JDK 7_u_21.
Let’s begin.
1. Create a new Maven project
Go to File -> Project ->Maven -> Maven Project.
In the “Select project name and location” page of the wizard, make sure that “Create a simple project (skip archetype selection)” option is checked, hit “Next” to continue with default values.
In the “Enter an artifact id” page of the wizard, you can define the name and main package of your project. We will set the “Group Id” variable to "com.javacodegeeks.snippets.enterprise"
and the “Artifact Id” variable to "springexample"
. The aforementioned selections compose the main project package as "com.javacodegeeks.snippets.enterprise.springexample"
and the project name as "springexample"
. Hit “Finish” to exit the wizard and to create your project.
The Maven project structure is shown below:
- It consists of the following folders:
- /src/main/java folder, that contains source files for the dynamic content of the application,
- /src/test/java folder contains all source files for unit tests,
- /src/main/resources folder contains configurations files,
- /target folder contains the compiled and packaged deliverables,
- the pom.xml is the project object model (POM) file. The single file that contains all project related configuration.
2. Add Spring 3.2.3 dependency
- Locate the “Properties” section at the “Overview” page of the POM editor and perform the following changes:
Create a new property with name org.springframework.version and value 3.2.3.RELEASE. - Navigate to the “Dependencies” page of the POM editor and create the following dependencies (you should fill the “GroupId”, “Artifact Id” and “Version” fields of the “Dependency Details” section at that page):
Group Id : org.springframework Artifact Id : spring-web Version : ${org.springframework.version}
Alternatively, you can add the Spring dependencies in Maven’s pom.xml
file, by directly editing it at the “Pom.xml” page of the POM editor, as shown below:
pom.xml:
<project xmlns="http://maven.apache.org/POM/4.0.0"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.javacodegeeks.snippets.enterprise</groupId> <artifactId>springexample</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> </dependencies> <properties> <spring.version>3.2.3.RELEASE</spring.version> </properties> </project>
As you can see Maven manages library dependencies declaratively. A local repository is created (by default under {user_home}/.m2 folder) and all required libraries are downloaded and placed there from public repositories. Furthermore intra – library dependencies are automatically resolved and manipulated.
3. Add cglib dependency.
The cglib library is needed in order to use the @Configuration
annotation. It is added to the pom.xml
file, as shown below:
pom.xml:
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>3.0</version> </dependency>
4. Create a simple Spring bean.
HelloWorldService.java:
package com.javacodegeeks.snippets.enterprise.services; public class HelloWorldService { public String sayHello() { System.out.println("Hello from Java Configuration. " + name); } }
5. Create the Java Configuration class.
The class is annotated with @Configuration
annotation, that indicates that the class can be used by the Spring IoC container as a source of bean definitions.
AppConfig.java:
package com.javacodegeeks.snippets.enterprise; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.javacodegeeks.snippets.enterprise.services.HelloWorldService; @Configuration public class AppConfig { @Bean(name="helloWorldBean") public HelloWorldService helloWorldService() { return new HelloWorldService(); } }
The @Bean
annotation over the helloWorld()
method indicates that this method produces a bean to be managed by the Spring container.
The xml file replaced by the Java Configuration class is shown below:
applicationContext.xml:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xsi:schemaLocation=" http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.2.xsd"> <bean id="helloWorldBean" class="com.javacodegeeks.snippets.enterprise.services.HelloWorldService"> <property name="name" value="Spring 3.2.3" /> </bean> </beans>
6. Run the application.
The AppConfig
class is loaded with the AnnotationConfigApplicationContext
.
App.java:
package com.javacodegeeks.snippets.enterprise; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import com.javacodegeeks.snippets.enterprise.services.HelloWorldService; public class App { @SuppressWarnings("resource") public static void main(String[] args) { /** * Create a new ApplicationContext, * deriving bean definition from the given annotated class * and automatically refreshing the context. */ ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); /** * Return an instance, which may be shared or * independent, of the specified bean. */ HelloWorldService obj = (HelloWorldService) context.getBean("helloWorldBean"); obj.sayHello("Spring 3.2.3"); } }
7. Output.
When you execute the application you should see something like the output presented below:
Hello from Java Configuration. Spring 3.2.3
This was an example of how to use Java Configuration class instead of xml configuration files in Spring.