Showing posts with label Autowiring. Show all posts
Showing posts with label Autowiring. Show all posts

Friday, 21 September 2018

How to use name parameter of @Resource Annotation in Spring Autowiring

Master Spring & Java Development!

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

🔔 Subscribe to Ram N Java

Overview: 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 name attribute 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 name ensures 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

  1. Declare the Target Bean: Define your bean in XML or using @Component("customBeanName").
  2. Annotate Field or Setter: Place @Resource(name = "customBeanName") directly on the dependent field or setter method.
  3. 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
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;
    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

package com.ram.model;

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

<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: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

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.displayEmployeeDetails();
    }

}

Output

Aug 23, 2018 9:55:39 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
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:

  • 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
  • Apply @Resource Annotation in setter method in Spring Autowiring | Spring - @Resource annotation

    Master Spring & Java Development!

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

    🔔 Subscribe to Ram N Java

    Overview: Setter-Based Injection with @Resource

    The standard Java @Resource annotation (part of the JSR-250 specification) provides a clean, standardized approach to dependency injection in the Spring Framework. While commonly used for field injection, applying @Resource on setter methods enables setter-based dependency injection, promoting proper encapsulation, easier testing, and flexibility during bean configuration.

    In this guide, you will learn how to configure and use @Resource on setter methods to inject dependencies cleanly into your Spring beans.

    Understanding Setter-Based @Resource Injection

    Using @Resource at the setter method level follows intuitive resolution rules:

    • Injection by Name by Default: When placed on a setter (such as setAddress(Address address)), Spring derives the default bean name from the property name (e.g., address).
    • Explicit Name Matching: You can explicitly specify the target bean name using @Resource(name = "customBeanName") directly on the setter method.
    • Fallback to Type: If no bean is found matching the derived name and no explicit name is specified, Spring resolves the dependency by type.
    • Encapsulation & Reusability: Setter injection keeps member variables private while still allowing dependencies to be provided or mocked during unit tests.

    Step-by-Step Implementation

    1. Define the Dependency Bean: Create the component to be injected and register it with the Spring container.
    2. Add Setter Method with @Resource: Create a standard setter method in your dependent class and annotate it with @Resource:
      @Resource
      public void setService(OrderService service) { this.service = service; }
    3. Initialize the Spring ApplicationContext: When the container starts, Spring invokes the annotated setter method and injects the matching bean.

    Recommended Next Videos from Ram N Java


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

    Click the below Image to Enlarge:
    Apply @Resource Annotation in setter method in Spring Autowiring | Spring - @Resource annotation

    Apply @Resource Annotation in setter method in Spring Autowiring | Spring - @Resource annotation

    Apply @Resource Annotation in setter method in Spring Autowiring | Spring - @Resource annotation
    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;
        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

    package com.ram.model;

    import javax.annotation.Resource;

    public class Employee
    {
        private String name;
        private Address address;

        public Employee(String name)
        {
            System.out.println("Employee(String name) constructor "
                    + "is called by the Spring container");
            this.name = name;
        }

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

        public void displayEmployeeDetails()
        {
            System.out.println(
                    "Employee [name=" + name + ", address=" + address + "]");
        }

    }

    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:annotation-config />
       
        <bean id="address" 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="employee" class="com.ram.model.Employee">
            <constructor-arg 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.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

    Aug 22, 2018 10:00:33 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Wed Aug 22 10:00:33 IST 2018]; root of context hierarchy
    Aug 22, 2018 10:00:34 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_setter.zip?attredirects=0&d=1

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

    Bitbucket Link:
    https://bitbucket.org/ramram43210/spring/src/02e04aa1b68a77d4f5a01ebf111e80370bd99ca8/Spring_2018/SpringDemo_Resource_annotation_setter/?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
  • Thursday, 13 September 2018

    @Resource Annotation in Spring Autowiring | Spring - @Resource annotation | Spring Tutorial

    Master Spring & Java Development!

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

    🔔 Subscribe to Ram N Java

    Overview: Simplifying Autowiring with @Resource

    Dependency injection in the Spring Framework can be configured using various annotations. While @Autowired is Spring's proprietary mechanism, the @Resource annotation is a Java standard defined by the JSR-250 specification (found in javax.annotation or jakarta.annotation). It provides a standardized and elegant way to inject dependencies by name directly into your Java classes.

    In this guide, you will learn how the @Resource annotation works, its default injection strategy, and how it simplifies autowiring in Spring applications.

    How @Resource Resolves Dependencies

    The @Resource annotation follows a clean, predictable resolution algorithm:

    • Injection by Name First: Unlike @Autowired (which injects by type by default), @Resource looks for a Spring bean matching the field name or setter property name.
    • Fallback to Type: If no bean is found with that specific name, Spring automatically falls back to matching by type.
    • Java Standard Compliance: Using @Resource decouples your codebase from Spring-specific annotations, aligning with standard Java EE / Jakarta EE conventions.
    • Flexible Placement: Can be applied directly on fields or setter methods to suit your architectural style.

    Step-by-Step Configuration

    1. Define Your Dependency Bean: Create and register your dependency component with an identifier matching your field name.
    2. Apply @Resource: Add the @Resource annotation above your field:
      @Resource
      private OrderService orderService;
    3. Enable Annotation Configuration: Ensure annotation config is active (e.g., using <context:annotation-config /> in XML or via standard component scanning).

    Recommended Next Videos from Ram N Java


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

    Click the below Image to Enlarge:
    @Resource Annotation in Spring Autowiring | Spring - @Resource annotation | Spring Tutorial


    @Resource Annotation in Spring Autowiring | Spring - @Resource annotation | Spring Tutorial

    @Resource Annotation in Spring Autowiring | Spring - @Resource annotation | 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>

    Address.java

    package com.ram.model;

    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

    package com.ram.model;

    import javax.annotation.Resource;

    public class Employee
    {
        private String name;
       
        @Resource
        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

    <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:annotation-config />
       
        <bean id="address" 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="employee" class="com.ram.model.Employee">
            <constructor-arg 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.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

    Aug 22, 2018 9:27:59 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5a2e4553: startup date [Wed Aug 22 09:27:59 IST 2018]; root of context hierarchy
    Aug 22, 2018 9:27:59 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.zip?attredirects=0&d=1

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

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