Master Spring & Java Development!
Subscribe to Ram N Java for clean, beginner-friendly coding guides!
🔔 Subscribe to Ram N JavaOverview: Using the 'name' Attribute in @Resource
The standard Java @Resource annotation (from the javax.annotation or jakarta.annotation package) provides a clean way to perform dependency injection by name in the Spring Framework. By default, Spring looks for a bean matching the field or setter name. However, specifying the name attribute explicitly allows you to resolve any bean regardless of variable naming conventions.
In this guide, you will learn how to use the name attribute within @Resource to wire specific beans cleanly into your classes.
Understanding @Resource(name = "...")
Using the name parameter provides predictable, deterministic wiring behavior:
-
Injection by Name: When the
nameattribute is provided, Spring evaluates the dependency strictly by bean identifier/name. -
Resolves Ambiguity: If multiple beans of the same type exist in your container, specifying
nameensures exactly the right bean is injected without requiring@Qualifier. - Decoupled Variable Names: Your field name no longer has to match the bean ID in your configuration.
Step-by-Step Usage
-
Declare the Target Bean: Define your bean in XML or using
@Component("customBeanName"). -
Annotate Field or Setter: Place
@Resource(name = "customBeanName")directly on the dependent field or setter method. - Initialize Application Context: Spring matches the explicit name with the registered bean and injects the dependency during initialization.
Recommended Next Videos from Ram N Java
Click here to watch on Youtube:
https://www.youtube.com/watch?v=pGDf2_51HEE&list=UUhwKlOVR041tngjerWxVccw
Click the below Image to Enlarge:
| How to use name parameter of @Resource Annotation in Spring Autowiring |
| How to use name parameter of @Resource Annotation in Spring Autowiring |
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
public class Address
{
private String city;
private String state;
private String country;
public Address(String city, String state, String country)
{
this.city = city;
this.state = state;
this.country = country;
}
@Override
public String toString()
{
return "Address [city=" + city + ", state=" + state + ", country="
+ country + "]";
}
}
Employee.java
import javax.annotation.Resource;
public class Employee
{
private String name;
@Resource(name="chennaiAddress")
private Address address;
public Employee(String name)
{
System.out.println("Employee(String name) constructor "
+ "is called by the Spring container");
this.name = name;
}
public void displayEmployeeDetails()
{
System.out.println(
"Employee [name=" + name + ", address=" + address + "]");
}
}
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:annotation-config />
<bean id="chennaiAddress" class="com.ram.model.Address" >
<constructor-arg value="Chennai"></constructor-arg>
<constructor-arg value="Tamil Nadu"></constructor-arg>
<constructor-arg value="India"></constructor-arg>
</bean>
<bean id="bangaloreAddress" class="com.ram.model.Address" >
<constructor-arg value="Bangalore"></constructor-arg>
<constructor-arg value="Karnataka"></constructor-arg>
<constructor-arg value="India"></constructor-arg>
</bean>
<bean id="employee" class="com.ram.model.Employee">
<constructor-arg value="Peter"></constructor-arg>
</bean>
</beans>
App.java
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.displayEmployeeDetails();
}
}
Output
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Thu Aug 23 09:55:39 IST 2018]; root of context hierarchy
Aug 23, 2018 9:55:39 AM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
Employee(String name) constructor is called by the Spring container
---------------------------------------
Got employee object from the ApplicationContext[Spring Container]
Employee [name=Peter, address=Address [city=Chennai, state=Tamil Nadu, country=India]]
Click the below link to download the code:
https://sites.google.com/site/ramj2eev2/java_basics/SpringDemo_Resource_annotation_name_attribute.zip?attredirects=0&d=1
Github Link:
https://github.com/ramram43210/javaee/tree/master/Spring_2018/SpringDemo_Resource_annotation_name_attribute
Bitbucket Link:
https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Resource_annotation_name_attribute/?at=master
See also: