Showing posts with label Date Injection. Show all posts
Showing posts with label Date Injection. Show all posts

Friday, 10 August 2018

How to inject Date into bean property using Factory bean in Spring

Master Spring & Java Development!

Subscribe to Ram N Java for clean, beginner-friendly coding guides!

🔔 Subscribe to Ram N Java

Overview: 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

  1. Define Date Formatter Bean: Set up a date formatting bean (such as SimpleDateFormat) with the desired date pattern in XML.
  2. Produce Date via Factory Method / FactoryBean: Invoke the parsing method using factory methods or a dedicated FactoryBean to produce the Date instance.
  3. 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>
  4. Run and Verify: Start the Spring context and verify that the target bean receives the correctly instantiated and formatted Date object.

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
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%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

package com.ram.model;

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

<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-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

package com.ram.core;

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

Jul 31, 2018 9:55:07 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
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:

  • All JavaEE Videos Playlist
  • All JavaEE Videos
  • All JAVA EE Links
  • Spring Tutorial
  • Servlets Tutorial
  • All Design Patterns Links
  • JDBC Tutorial
  • Java Collection Framework Tutorial
  • JAVA Tutorial
  • Kids Tutorial
  • Cooking Tutorial
  • Tutorials