Showing posts with label p-namespace. Show all posts
Showing posts with label p-namespace. Show all posts

Wednesday, 1 August 2018

How to inject dependent object using Spring’s p namespace in XML configuration

Enjoying This Tutorial?

Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!

SUBSCRIBE NOW

Introduction

In the Spring Framework, configuring bean properties using traditional nested <property> and <ref bean="..."/> tags can make your XML configuration files lengthy and cluttered. To streamline this, Spring provides the p-namespace, which allows you to define bean properties and wire dependent objects directly as XML attributes.

Why Use Spring's 'p' Namespace for Object References?

  • Cleaner, Concise Syntax: Eliminates nested child tags, condensing multi-line property definitions into concise single-line bean declarations.
  • Special '-ref' Suffix: By appending -ref to any property name (e.g., p:address-ref="addressBean"), Spring automatically recognizes that you are wiring an object reference rather than a literal value.
  • No XSD Schema Location Required: The p namespace does not require an explicit XSD file definition in your schema location, making the XML header lightweight.

Step-by-Step Configuration Example

First, declare the xmlns:p namespace inside your root <beans> tag:

xmlns:p="http://www.springframework.org/schema/p"

1. Wiring Dependent Objects via p-namespace

Notice how simple it is to wire the dependent address bean into employee using p:address-ref:

<!-- Dependent Bean -->
<bean id="addressBean" class="com.ram.model.Address"
      p:city="Chennai"
      p:state="Tamil Nadu"
      p:country="India" />

<!-- Enclosing Bean with Object Reference -->
<bean id="employee" class="com.ram.model.Employee"
      p:id="101"
      p:name="Ram"
      p:address-ref="addressBean" />

2. Loading the Beans in Java

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

Employee emp = (Employee) context.getBean("employee");
emp.displayEmployeeInfo();

Key Takeaway

Using Spring's p namespace together with the -ref suffix gives you the best of both worlds: full setter-based dependency injection capabilities with significantly cleaner and more readable XML declarations.


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

Click the below Image to Enlarge:
How to inject dependent object using Spring’s p namespace in XML configuration

How to inject dependent object using Spring’s p namespace in XML configuration

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>

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 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 Address getAddress()
    {
        return address;
    }

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

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

}

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"
    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="TamilNadu"></property>
        <property name="state" value="Chennai"></property>
    </bean>

    <bean id="employee" class="com.ram.model.Employee" p:id="100"
        p:name="Peter" p:address-ref="address">
    </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 08, 2018 8:18:36 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sun Jul 08 08:18:36 IST 2018]; root of context hierarchy
Jul 08, 2018 8:18:36 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, address=Address [city=TamilNadu, state=Chennai]]

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

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

Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/764179f1702395ebc0d4ce50fe5125258c342eb8/Spring_2018/SpringDemo_p_namespace_dependentObject/?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
  • What is Spring’s p namespace in XML configuration

    Enjoying This Tutorial?

    Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!

    SUBSCRIBE NOW

    Introduction

    In standard Spring XML configurations, setting properties typically requires nested <property name="..." value="..."/> tags. When a bean has many attributes, your XML files can quickly become verbose and difficult to navigate. The p-namespace in Spring provides a streamlined, elegant alternative that allows you to configure property values directly as XML bean tag attributes.

    Why Use the 'p' Namespace?

    • Eliminate Boilerplate: Convert multiple lines of nested <property> elements into compact, clean single-line bean definitions.
    • Zero Schema Location Overhead: The p namespace does not require a formal XSD schema location declaration in the XML header.
    • Seamless Setter Injection: Under the hood, Spring continues to use standard setter methods, ensuring full compatibility with your existing Java classes.

    Step-by-Step Configuration Example

    To start using the p namespace, simply include its namespace declaration in the root <beans> element:

    xmlns:p="http://www.springframework.org/schema/p"

    1. Traditional Configuration vs. p-namespace

    Here is how a bean looks using traditional property tags:

    <bean id="user" class="com.ram.model.User">
        <property name="id" value="101"/>
        <property name="name" value="Ram"/>
        <property name="email" value="ram@example.com"/>
    </bean>

    With the p-namespace, the configuration is concise and clean:

    <bean id="user" class="com.ram.model.User"
          p:id="101"
          p:name="Ram"
          p:email="ram@example.com" />

    2. Loading the Bean in Java

    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    
    User user = (User) context.getBean("user");
    System.out.println("User ID: " + user.getId() + ", Name: " + user.getName());

    Key Takeaway

    The p namespace provides an intuitive and compact syntax for XML-based dependency injection. It significantly enhances configuration readability and reduces XML verbosity without sacrificing any dependency injection features.


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

    Click the below Image to Enlarge:
    What is Spring’s p namespace in XML configuration

    What is Spring’s p namespace in XML configuration


    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;

    /**
     * Spring bean
     *
     */

    public class Employee
    {
        private String name;

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

        public void employeeDetails()
        {
            System.out.println("Employee Name =  " + name);
        }
    }

    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"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">


        <bean id="employee" class="com.ram.model.Employee" p:name="Peter">
        </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)");
            employee.employeeDetails();

        }

    }

    Output

    Jul 07, 2018 8:51:06 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Sat Jul 07 08:51:06 IST 2018]; root of context hierarchy
    Jul 07, 2018 8:51:06 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

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

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

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/42c66b7d9692a3dc3e770c804733a8013c61553b/Spring_2018/SpringDemo_p_namespace/?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