Tuesday, 26 June 2018

Spring bean inheritance | Spring bean configuration inheritance | Spring Tutorial | Spring basics

🚀 Ready to Master Spring Framework?

Join the Ram N Java community for more deep dives into Java!

SUBSCRIBE NOW

Mastering Spring Bean Inheritance

In the world of the Spring Framework, efficiency is key. One of the most powerful features for keeping your configuration files clean and maintainable is Spring Bean Inheritance. In this guide, we'll break down exactly what it is and why you should use it.

What is Bean Inheritance?

Just like in standard Java where one class can inherit properties from another, Spring allows a bean definition to inherit configuration data from a "parent" bean. This data can include property values, constructor arguments, and even initialization methods.

Why Use Inheritance in Configuration?

When you have multiple beans that share the same base configuration (like a common database URL or a shared company name), you don't want to repeat that information over and over. By using inheritance:

  • Reduce Redundancy: You write your common configuration once in the parent bean.
  • Easier Maintenance: Need to change a value? Update it in one place, and all child beans get the update.
  • Cleaner XML: Your configuration files become shorter and much easier to read.

How to Implement It

In your XML configuration, you simply use the parent attribute in your bean tag. The child bean will then "copy" all the setup from the specified parent. You can still provide unique values in the child bean to override the parent's values where necessary.

Pro Tip for Beginners:

Bean inheritance is purely a configuration feature. It doesn't mean the Java classes themselves have to be related through inheritance!


Recommended Tutorials

Check out these other related videos from the Ram N Java channel to expand your knowledge:


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

Click the below Image to Enlarge:
Spring bean inheritance | Spring bean configuration inheritance | Spring Tutorial | Spring basics

Spring bean inheritance | Spring bean configuration inheritance | Spring Tutorial | Spring basics

Spring bean inheritance | Spring bean configuration inheritance | Spring Tutorial | Spring basics

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>

Person.java

package com.ram.model;

public class Person
{

    private int numberOfLegs;
    private int numberOfHands;
    private int id;
    private String name;

    public Person(int numberOfLegs, int numberOfHands)
    {
        System.out.println("Person(int numberOfLegs, int numberOfHands) "
                + "constructor is called by the Spring container");
        this.numberOfLegs = numberOfLegs;
        this.numberOfHands = numberOfHands;
    }

    public Person(int numberOfLegs, int numberOfHands, int id, String name)
    {
        System.out.println(
                "Person(int numberOfLegs, int numberOfHands, int id, String name) "
                        + "constructor is called by the Spring container");
        this.numberOfLegs = numberOfLegs;
        this.numberOfHands = numberOfHands;
        this.id = id;
        this.name = name;
    }

    public void displayPersonDetails()
    {
        System.out.println("Person [id=" + id + ", name=" + name
                + ", numberOfLegs=" + numberOfLegs + ", numberOfHands="
                + numberOfHands + "]");
    }

}

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="person" class="com.ram.model.Person">
        <constructor-arg type="int" value="2"></constructor-arg>
        <constructor-arg type="int" value="2"></constructor-arg>
    </bean>

    <bean id="personPeter" class="com.ram.model.Person" parent="person">
        <constructor-arg type="int" value="200"></constructor-arg>
        <constructor-arg type="String" value="Peter"></constructor-arg>
    </bean>

</beans>

App.java

package com.ram.core;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.ram.model.Person;

public class App
{
    public static void main(String[] args)
    {
        ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        System.out.println("---------------------------------------");

        Person person = (Person) context.getBean("person");
        System.out.println(
                "Got person object from the ApplicationContext(Spring Container)");
        person.displayPersonDetails();
     
        System.out.println("---------------------------------------");
     
        Person personPeter = (Person) context.getBean("personPeter");
        System.out.println(
                "Got personPeter object from the ApplicationContext(Spring Container)");
        personPeter.displayPersonDetails();

    }

}

Output

May 08, 2018 10:12:27 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Tue May 08 10:12:27 IST 2018]; root of context hierarchy
May 08, 2018 10:12:28 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Person(int numberOfLegs, int numberOfHands) constructor is called by the Spring container
Person(int numberOfLegs, int numberOfHands, int id, String name) constructor is called by the Spring container
---------------------------------------
Got person object from the ApplicationContext(Spring Container)
Person [id=0, name=null, numberOfLegs=2, numberOfHands=2]
---------------------------------------
Got personPeter object from the ApplicationContext(Spring Container)
Person [id=200, name=Peter, numberOfLegs=2, numberOfHands=2]

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

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

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