This is an example to show you how we can inject dependencies using constructor injection within Spring XML configuration.
Use Case
Our use case is simple, we want to establish the dependencies between app, service and data access layers.
We want to retrieve list of users from database (mocked in our case) using a data access object. Service refers to the data access object to fetch the users.
As part of this example, we will create HibernateUserDAOImpl which implements UserDAO interface.
UserServiceImpl refers to UserDAO to fetch the users and it implements UserService interface.
Our app, Application refers to UserService to fetch the user list.
Creation of Maven Project
First create a simple Maven project by skipping archtype selection in STS.
Add below pom.xml file which can be found at the root of the project.
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.techstackjournal</groupId>
<artifactId>xml-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
Right click on the project, and select Maven=>Update Project, to download all the dependencies.
Creation of Model Object
User class is a POJO class to hold the individual user objects.
package com.techstackjournal.model;
public class User {
private String userId;
private String firstName;
private String lastName;
private String email;
public User() {
// TODO Auto-generated constructor stub
}
public User(String userId, String firstName, String lastName, String email) {
super();
this.userId = userId;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User [userId=" + userId + ", firstName=" + firstName + ", lastName=" + lastName + ", email=" + email
+ "]";
}
}
Creation of Data Access Object Layer
Create UserDAO
interface in com.techstackjournal.dao
package under src/main/java.
package com.techstackjournal.dao;
import java.util.List;
import com.techstackjournal.model.User;
public interface UserDAO {
List<User> findAll();
}
Create HibernateUserDAOImpl
class in com.techstackjournal.dao
package under src/main/java. This class supposedly fetch user data from the database, but for simplicity we are mocking user details.
package com.techstackjournal.dao;
import java.util.ArrayList;
import java.util.List;
import com.techstackjournal.model.User;
public class HibernateUserDAOImpl implements UserDAO {
public List<User> findAll() {
List<User> users = new ArrayList<User>();
users.add(new User("1", "John", "Doe", "john.doe@techstackjournal.com"));
users.add(new User("2", "Jane", "Doe", "jane.doe@techstackjournal.com"));
return users;
}
}
Creation of Service Layer
Create UserService
interface in com.techstackjournal.service
package under src/main/java.
package com.techstackjournal.service;
import java.util.List;
import com.techstackjournal.model.User;
public interface UserService {
List<User> findAll();
}
Create UserServiceImpl
class in com.techstackjournal.service
package under src/main/java.
package com.techstackjournal.service;
import java.util.List;
import com.techstackjournal.dao.UserDAO;
import com.techstackjournal.model.User;
public class UserServiceImpl implements UserService {
private UserDAO userDao;
public UserServiceImpl(UserDAO userDao) {
super();
this.userDao = userDao;
}
public List<User> findAll() {
return userDao.findAll();
}
}
Wiring Beans in Application Context using Constructor Injection
Create appContext.xml file under src/main/resources to declare and wire the UserDAO
and UserService
beans together.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean name="userDao"
class="com.techstackjournal.dao.HibernateUserDAOImpl" />
<bean name="userService"
class="com.techstackjournal.service.UserServiceImpl">
<constructor-arg index="0" ref="userDao" />
</bean>
</beans>
Getting the Service Instance in Application
Finally, in our application we’ll get the instance of UserService
and call the findAll
method to fetch user list.
package com.techstackjournal.app;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.techstackjournal.model.User;
import com.techstackjournal.service.UserService;
public class Application {
public static void main(String[] args) {
ApplicationContext appContext = new ClassPathXmlApplicationContext("appContext.xml");
UserService service = appContext.getBean("userService", UserService.class);
List<User> users = service.findAll();
for (User user : users) {
System.out.println(user);
}
}
}
The output of this program would be as below:
User [userId=1, firstName=John, lastName=Doe, email=john.doe@techstackjournal.com]
User [userId=2, firstName=Jane, lastName=Doe, email=jane.doe@techstackjournal.com]