Free Data Structures and Algorithms Course









Subscribe below and get all best seller courses for free !!!










OR



Subscribe to all free courses

How AutoWiring works in Spring Framework ?

Program to demonstrate how AutoWiring works in Spring Framework.

In the Spring Framework bean model, beans have relationships with other beans. In order to satisfy these dependencies of injecting one bean into another we use autowire functionality of Spring Framework. In this tutorial we are taking 6 scenarios by which Spring autowires one bean to another. The Scenarios are changed based on Spring Configuration files and rest all the source code given in this tutorial is the same.

In order to run each scenario individually we just change Spring Configuration xml file and rest code remains the same. So for each scenario to run individual we need

1. Employee POJO class which has-a Address class object
2. Address POJO class which will be wired to Employee class through auto-wiring
3. Test class to test the application
4. Scenario based xml file provided below individually for each scenario


Address POJO class -

package com.hubberspot.spring.autowire;


public class Address {

 private String street;
 private String city;
 private String state;

 public Address() {

 }


 public String getStreet() {
  return street;
 }


 public void setStreet(String street) {
  this.street = street;
 }


 public String getCity() {
  return city;
 }


 public void setCity(String city) {
  this.city = city;
 }


 public String getState() {
  return state;
 }


 public void setState(String state) {
  this.state = state;
 }

}





Employee POJO class -

package com.hubberspot.spring.autowire;

// Create a POJO class Employee which has a 
// Address Object reference as instance variable
public class Employee {

 private String name;
 private int age;
 private Address address;

 public Employee( String name ) {

  this.name = name;

 }

 public Employee( Address address) {
  this.address = address;
 }

 public String getName() {
  return name;
 }

 public void setName(String name) {
  this.name = name;
 }

 public int getAge() {
  return age;
 }

 public void setAge(int age) {
  this.age = age;
 }


 public Address getAddress() {
  return address;
 }


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

}



Scenario 1 - autowire="no"


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

 <!-- Scenario 1 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  autowire="no">

  <property name="name" value="Jonty" />
  <property name="age" value="28" />
  <property name="address" ref="address"></property>
 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>
 
 </beans>


In the above scenario we are using autowire attribute value as "no". It means we are using no auto-wiring, so we have to provide ref attribute for referring any bean.

Scenario 2 - autowire="byName"


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

 <!-- Scenario 2 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  autowire="byName">

  <property name="name" value="Jonty" />
  <property name="age" value="28" />

 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>

</beans>


In the above scenario we are using autowire attribute value as "byName". It means we are using auto-wiring based on name of property, so here Employee has a Address property. Here we have a property in Employee by name as : Address address. So when we say that auto-wire by name Spring sees in configuration that whether there is any bean with id equal to name of property. As soon as it finds this property and its matching id, it uses its setter method to set the property .

Scenario 3 - autowire="byType"


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

 <!-- Scenario 3 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  autowire="byType">

  <property name="name" value="Jonty" />
  <property name="age" value="28" />

 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>

</beans>


In the above scenario we are using autowire attribute value as "byType". It means we are using auto-wiring based on type of property, so here Employee has a Address property. Here we have a property in Employee by type as : com.hubberspot.spring.autowire.Address . So when we say that auto-wire by type Spring sees in configuration that whether there is any bean with class equal to type of property. As soon as it finds any matching, it uses its setter method to set the property.


Scenario 4 - autowire="constructor"


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- Scenario 4 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  autowire="constructor">

  <property name="name" value="Jonty" />
  <property name="age" value="28" />

 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>


</beans>


In the above scenario we are using autowire attribute value as "constructor". It means we are using auto-wiring based on constructor arguments , so here Employee has a Address property. Here we have a constructor in Employee class which takes a argument as : Address address. So when we say that auto-wire by constructor Spring sees in configuration that whether there is any bean with id equal to constructor argument. As soon as it finds any matching , it uses its setter method to set the property .


Scenario 5 - p:namespace


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

<!-- Scenario 5 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  p:name="Jonty">

  <property name="age" value="28" />
  <property name="address" ref="address" />

 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>

</beans>


Scenario 6 - c:namespace


1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
 xmlns:p="http://www.springframework.org/schema/p"
 xmlns:c="http://www.springframework.org/schema/c"

 xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

 <!-- Scenario 6 -->

 <bean id="employee" class="com.hubberspot.spring.autowire.Employee"
  c:name="Jonty">

  <property name="age" value="28" />
  <property name="address" ref="address" />

 </bean>

 <bean id="address" class="com.hubberspot.spring.autowire.Address">

  <property name="street" value="Town Hall Street" />
  <property name="city" value="Pune" />
  <property name="state" value="Maharashtra"></property>
 </bean>


</beans>


Scenario 5 and 6 are using p:namespace and c:namespace which have been introduced in Spring 3.1 . In order to use these namespaces we have to first provide these namespace schemas in the header of xml files as :
"xmlns:p="http://www.springframework.org/schema/p"
xmlns:c="http://www.springframework.org/schema/c"

After providing the namespace we can directly use it as p:(property name) and c:(constructor argument) which are same like using property and constructor-arg tag.

Test class -

package com.hubberspot.spring.autowire;

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

public class Test {

 public static void main(String[] args) {

  // ApplicationContext is a Spring interface which 
  // provides with the configuration for an application. 
  // It provides us with all the methods that BeanFactory 
  // provides. It loads the file resources in a older 
  // and generic manner. It helps us to publish events to the
  // listener registered to it. It also provides quick support
  // for internationalization. It provides us with the object 
  // requested, it reads the configuration file and provides
  // us with the necessary object required.
  // We are using concrete implementation of ApplicationContext
  // here called as ClassPathXmlApplicationContext because this 
  // bean factory reads the xml file placed in the classpath of 
  // our application. We provide ClassPathXmlApplicationContext
  // with a configuration file called as spring.xml placed
  // at classpath of our application. 
  ApplicationContext context = 
    new ClassPathXmlApplicationContext(("spring.xml"));

  // In order to get a object instantiated for a particular bean 
  // we call getBean() method of ClassPathXmlApplicationContext
  // passing it the id for which the object is to be needed. 
  // Here getBean() returns an Object. We need to cast it back 
  // to the Employee object. Without implementing new keyword we 
  // have injected object of Employee just by reading an xml 
  // configuration file.
  Employee employee = (Employee)context.getBean("employee");

  System.out.println("The name of Employee is : " + employee.getName());
  System.out.println("The age of Employee is : " + employee.getAge());
  System.out.println("The address of Employee is : " + 
    employee.getAddress().getStreet() +" "+
    employee.getAddress().getCity() +" "+
    employee.getAddress().getState());

 }

}



Output of the program : 


 
 
© 2021 Learn Java by Examples Template by Hubberspot