Wednesday, 18 July 2018

What is no Auto-wiring mode in Spring?

Enjoying This Tutorial?

Subscribe to Ram N Java for high-quality, practical Java and Spring tutorials!

SUBSCRIBE NOW

Introduction

Auto-wiring in the Spring Framework allows the IoC container to automatically resolve and inject dependencies between collaborating beans. By default, Spring sets the autowiring mode to no (or default). In this mode, Spring does not automatically wire any collaborator beans; all dependencies must be explicitly wired by the developer.

What Is "no" Auto-Wiring Mode?

  • Default Configuration: When you do not specify an autowire attribute on the <bean> tag, Spring defaults to autowire="no".
  • Explicit Wiring Required: All object references must be explicitly defined using <property ref="..."/> or <constructor-arg ref="..."/> tags.
  • Maximum Clarity and Control: While it requires slightly more XML code, explicit wiring prevents accidental wiring errors and makes large application configurations easy to track and audit.

Step-by-Step Configuration Example

Here is an example showing how beans are configured when autowire="no" is in effect:

1. Bean Configuration in applicationContext.xml

Dependencies are explicitly linked using the ref attribute:

<!-- Dependent Bean -->
<bean id="address" class="com.ram.model.Address">
    <property name="city" value="Bangalore" />
    <property name="state" value="Karnataka" />
</bean>

<!-- Bean configured with autowire="no" (explicit wiring required) -->
<bean id="employee" class="com.ram.model.Employee" autowire="no">
    <property name="id" value="101" />
    <property name="name" value="Ram" />
    <property name="address" ref="address" />
</bean>

2. Executing with ApplicationContext

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

Employee emp = (Employee) context.getBean("employee");
emp.displayInfo();

Key Takeaway

The autowire="no" setting is best suited for complex enterprise systems where explicit configuration is preferred to prevent ambiguity and ensure complete transparency over how components interact and wire together.


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

Click the below Image to Enlarge:

What is no Auto-wiring mode in Spring?
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;

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;
    }

    public Employee(String name, Address address)
    {
        System.out.println("Employee(String name, Address address) "
                + "constructor is called by the Spring container");
        this.name = name;
        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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">


    <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" autowire="no">
        <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

Jul 03, 2018 9:15:42 AM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@5b37e0d2: startup date [Tue Jul 03 09:15:42 IST 2018]; root of context hierarchy
Jul 03, 2018 9:15:42 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=null]

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

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

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