Tuesday, 25 September 2018

How to do Dependency Injection using Spring Expression Language SpEL(XML) | Spring Tutorial

Master Spring & Java Development!

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

🔔 Subscribe to Ram N Java

Overview: Dependency Injection with SpEL via XML

In Spring applications, Dependency Injection (DI) in XML is commonly achieved using the ref attribute. However, the Spring Expression Language (SpEL) provides an expressive, flexible alternative by allowing you to inject bean references and dependencies directly inside the value attribute using expression evaluation.

In this guide, you will learn how to perform Dependency Injection using SpEL within an XML-based configuration.

How SpEL-Based Dependency Injection Works in XML

SpEL expressions allow you to wire beans and properties dynamically during container startup:

  • Injecting Bean Dependencies: Wire a dependency bean reference directly using the value attribute: <property name="item" value="#{itemBean}" />.
  • Flexible Bean Wiring: Inject bean references or extracted properties using a unified expression syntax.
  • Dynamic Evaluation: Resolve target beans and their dependencies dynamically at runtime during ApplicationContext initialization.
  • Clear Declarative Setup: Maintain readable and flexible configuration files without altering your Java source code.

Step-by-Step XML Configuration

  1. Define the Dependency Bean: Declare the source bean in your XML file with an id and its respective properties.
  2. Configure the Dependent Bean: In the dependent bean definition, use the <property> tag and supply the SpEL expression referencing the dependency bean:
    <property name="address" value="#{addressBean}" />
  3. Container Initialization: When the ApplicationContext loads, Spring resolves the expression and injects the dependency bean automatically.

Recommended Next Videos from Ram N Java


Click here to watch on Youtube:
https://www.youtube.com/watch?v=QuNFQXj20dM&list=UUhwKlOVR041tngjerWxVccw

Click the below Image to Enlarge:
How to do Dependency Injection using Spring Expression Language SpEL(XML) | Spring Tutorial

How to do Dependency Injection using Spring Expression Language SpEL(XML) | Spring Tutorial

How to do Dependency Injection using Spring Expression Language SpEL(XML) | Spring Tutorial
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.5.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>

Address.java

package com.ram.model;

public class Address
{
    private String city;
    private String state;

    public String getCity()
    {
        return city;
    }

    public void setCity(String city)
    {
        this.city = city;
    }

    public String getState()
    {
        return state;
    }

    public void setState(String state)
    {
        this.state = state;
    }

    @Override
    public String toString()
    {
        return "Address [city=" + city + ", state=" + state + "]";
    }

}

Employee.java

package com.ram.model;

public class Employee
{
    private int id;
    private String name;
    private String employeeState;
    private Address address;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getEmployeeState()
    {
        return employeeState;
    }

    public void setEmployeeState(String employeeState)
    {
        this.employeeState = employeeState;
    }

    public Address getAddress()
    {
        return address;
    }

    public void setAddress(Address address)
    {
        this.address = address;
    }

    @Override
    public String toString()
    {
        return "Employee [id=" + id + ", name=" + name + ", employeeState="
                + employeeState + ", address=" + address + "]";
    }

}

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="address" class="com.ram.model.Address">
        <property name="city" value="Chennai"></property>
        <property name="state" value="TamilNadu"></property>
    </bean>


    <bean id="employee" class="com.ram.model.Employee">
        <property name="id" value="100"></property>
        <property name="name" value="Peter"></property>
        <property name="address" value="#{address}"></property>
        <property name="employeeState" value="#{address.state}"></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

Aug 30, 2018 11:14:01 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@736e9adb: startup date [Thu Aug 30 11:14:01 IST 2018]; root of context hierarchy
Aug 30, 2018 11:14:02 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 [id=100, name=Peter, employeeState=TamilNadu, address=Address [city=Chennai, state=TamilNadu]]

Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Spring_EL_XML.zip?attredirects=0&d=1

Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Spring_EL_XML

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Spring_EL_XML/?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
  • No comments:

    Post a Comment

    Tutorials