Thursday, 30 August 2018

How to define custom component name in Spring Auto Scanning Components | Spring Tutorial

Master Spring & Java Development!

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

🔔 Subscribe to Ram N Java

Overview: Naming Spring Beans in Auto Scanning

When using auto component scanning in the Spring Framework, Spring automatically registers discovered classes into the ApplicationContext. By default, it assigns a bean name using decapitalized camel-case naming (for example, CustomerService becomes customerService). However, situations often arise where you want to specify an explicit, custom bean identifier to make bean retrieval or qualifier matching clearer and more predictable.

In this guide, you will learn how to assign custom component names using stereotype annotations during automatic component scanning in Spring.

Default Naming vs. Custom Component Names

Understanding how Spring names scanned beans helps you organize your architecture and avoid bean identifier collisions:

  • Default Bean Naming Strategy: Spring relies on BeanNameGenerator (typically AnnotationBeanNameGenerator), which takes the short class name and lowers the first character.
  • Custom Bean Naming via Annotations: You can override the default naming convention by passing a string value directly into @Component("myCustomName") or related stereotypes (@Service, @Repository, @Controller).
  • Predictable Injection: Custom names allow seamless integration with @Qualifier("myCustomName") or @Resource(name = "myCustomName") when resolving bean ambiguities.

Step-by-Step Implementation

  1. Add Stereotype with Custom Value: Define the custom bean name directly in the annotation parameter:
    @Component("customOrderManager")
    public class OrderManager { ... }
  2. Retrieve or Inject the Bean: You can retrieve the bean directly by its custom name from the container:
    OrderManager orderManager = (OrderManager) context.getBean("customOrderManager");
  3. Inject via Qualifiers: Alternatively, reference it cleanly with @Qualifier("customOrderManager") inside collaborating classes.

Recommended Next Videos from Ram N Java


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

Click the below Image to Enlarge:
How to define custom component name in Spring Auto Scanning Components | Spring Tutorial

How to define custom component name in Spring Auto Scanning Components | Spring Tutorial

How to define custom component name in Spring Auto Scanning Components | 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.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>

EmployeeDAO.java

package com.ram.dao;

import org.springframework.stereotype.Component;

@Component
public class EmployeeDAO
{
    public void addEmployee()
    {
        System.out.println("inside EmployeeDAO addEmployee()");
    }

}

EmployeeService.java

package com.ram.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.ram.dao.EmployeeDAO;

@Component("empSer")
public class EmployeeService
{
    @Autowired
    EmployeeDAO employeeDAO;

    public void addEmployee()
    {
        System.out.println("inside EmployeeService addEmployee()");
        employeeDAO.addEmployee();
    }

    @Override
    public String toString()
    {
        return "EmployeeService [employeeDAO=" + employeeDAO + "]";
    }

}

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd">


    <context:component-scan base-package="com.ram" />

</beans>

App.java

package com.ram.core;

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

import com.ram.service.EmployeeService;

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

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

        EmployeeService employeeService = context.getBean("empSer",
                EmployeeService.class);
        System.out.println(
                "Got employeeService object from the ApplicationContext(Spring Container)");

        System.out.println(employeeService);

        employeeService.addEmployee();

    }

}

Output

Aug 15, 2018 9:59:15 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Wed Aug 15 09:59:15 IST 2018]; root of context hierarchy
Aug 15, 2018 9:59:15 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
---------------------------------------
Got employeeService object from the ApplicationContext(Spring Container)
EmployeeService [employeeDAO=com.ram.dao.EmployeeDAO@16022d9d]
inside EmployeeService addEmployee()
inside EmployeeDAO addEmployee()

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

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

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