Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: Injecting Date Properties with Factory Beans
In the Spring Framework, injecting primitive data types and strings into bean properties is straightforward. However, configuring non-trivial objects like java.util.Date directly through XML can be tricky because dates require parsing from formatted strings. A clean, robust way to handle this without hardcoded logic is by utilizing a FactoryBean (such as SimpleDateFormat with factory methods or custom factory bean implementations).
In this guide, you will learn how to configure and inject a java.util.Date object into a Spring bean property using factory bean mechanisms.
Why Use Factory Beans for Date Injection?
Working with complex object creation in Spring configuration brings several advantages:
- Encapsulated Instantiation: Factory beans encapsulate complex parsing, custom formatting, and initialization logic away from consumer beans.
- Clean XML Configuration: Instead of embedding conversion code across classes, date parsing is declared cleanly in configuration.
- Reusability: Once configured, the resulting date bean or format factory can be injected across multiple beans in your application context.
- Decoupled Architecture: Keeps domain and service beans free of parsing boilerplate and focused purely on core business logic.
Step-by-Step Implementation
-
Define Date Formatter Bean: Set up a date formatting bean (such as
SimpleDateFormat) with the desired date pattern in XML. -
Produce Date via Factory Method / FactoryBean: Invoke the parsing method using factory methods or a dedicated
FactoryBeanto produce theDateinstance. -
Inject into Target Bean: Reference the parsed date bean in your target bean's property definition:
<bean id="targetBean" class="com.example.Person">
<property name="dateOfBirth" ref="dateBean"/>
</bean> -
Run and Verify: Start the Spring context and verify that the target bean receives the correctly instantiated and formatted
Dateobject.
Recommended Next Videos from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=VRY-L0BKzDU&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| How to inject Date into bean property using Factory bean in Spring |
| How to inject Date into bean property using Factory bean in Spring |
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0%20http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ram.core</groupId>
<artifactId>SpringDemo</artifactId>
<packaging>jar</packaging>
<version>1.0-SNAPSHOT</version>
<name>SpringDemo</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring 5 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>
</project>
Employee.java
import java.util.Date;
public class Employee
{
private String name;
private Date dateOfBirth;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public Date getDateOfBirth()
{
return dateOfBirth;
}
public void setDateOfBirth(Date dateOfBirth)
{
this.dateOfBirth = dateOfBirth;
}
@Override
public String toString()
{
return "Employee [name=" + name + ", dateOfBirth=" + dateOfBirth + "]";
}
}
applicationContext.xml
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-4.3.xsd">
<bean id="dateFormat" class="java.text.SimpleDateFormat">
<constructor-arg value="yyyy-MM-dd" />
</bean>
<bean id="employee" class="com.ram.model.Employee">
<property name="name">
<value>Peter</value>
</property>
<property name="dateOfBirth">
<bean factory-bean="dateFormat" factory-method="parse">
<constructor-arg value="2010-01-31" />
</bean>
</property>
</bean>
</beans>
App.java
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.ram.model.Employee;
public class App
{
public static void main(String[] args)
{
ApplicationContext context = new ClassPathXmlApplicationContext(
"applicationContext.xml");
System.out.println("---------------------------------------");
Employee employee = (Employee) context.getBean("employee");
System.out.println(
"Got employee object from the ApplicationContext(Spring Container)");
System.out.println(employee);
}
}
Output
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Tue Jul 31 09:55:07 IST 2018]; root of context hierarchy
Jul 31, 2018 9:55:07 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
Got employee object from the ApplicationContext(Spring Container)
Employee [name=Peter, dateOfBirth=Sun Jan 31 00:00:00 IST 2010]
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_inject_date.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_inject_date
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/463ef0439e374e3884b06b8ead881ecf3ac4364f/Spring_2018/SpringDemo_inject_date/?at=master
See also: