Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: 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(typicallyAnnotationBeanNameGenerator), 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
-
Add Stereotype with Custom Value: Define the custom bean name directly in the annotation parameter:
@Component("customOrderManager")
public class OrderManager { ... } -
Retrieve or Inject the Bean: You can retrieve the bean directly by its custom name from the container:
OrderManager orderManager = (OrderManager) context.getBean("customOrderManager"); -
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
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
import org.springframework.stereotype.Component;
@Component
public class EmployeeDAO
{
public void addEmployee()
{
System.out.println("inside EmployeeDAO addEmployee()");
}
}
EmployeeService.java
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
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
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
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:
No comments:
Post a Comment