Friday, 3 May 2019

Explain @Autowired Annotation in Spring

@Autowired Annotation in Spring

Spring bean dependencies are defined in the XML files the same can be automatically detected by the Spring container by using the @Autowired annotation. This would eliminate using the XML configurations. Introduced in Spring 2.5, the @Autowired annotation can be applied to


On setter methods
On Properties
On Constructors
@Autowired with arguments

Let us see an example for each of the above. Let us have working Eclipse IDE in place and follow the following steps to create a Spring application:

Create a project: Create a project with a name SpringAnnotationExamples and create a package com.aid.autowireexample under the src directory in the created project.

Add Libraries: Add required Spring libraries using Add External JARs option as explained in the article Customizing callback methods.

Create source files: Create Java classes Product,Type and MainApp under the com.aid.autowireexample package.

Create configuration file: Create XML based configuration file BeansAutowireAnnotation.xml under src directory.

@Autowired Annotation Example

1. @Autowired on setter methods

When spring containers finds @autowired annotation with setter methods,it autowires bean byType .

byType – Allows a property to be autowired if exactly one bean of the property type exists in the container.

The class Product.java, is simple POJO class having name,price and an object of Type class.

Contents of Product.java are:

 package com.aid.autowireexample;



 import org.springframework.beans.factory.annotation.Autowired;



 public class Product {

  private Integer price;

  private String name;

  private Type type;



  public Integer getPrice() {

   return price;

  }



  public void setPrice(Integer price) {

   this.price = price;

  }



  public Type getType() {

   return type;

  }



  @Autowired

  public void setType(Type type) {

   this.type = type;

  }



  public String getName() {

   return name;

  }



  public void setName(String name) {

   this.name = name;

  }

 }

 


The Type.java class is also a POJO class having a string object called “type”.

Contents of Type.java are:

package com.aid.autowireexample;



 public class Type {



  private String type;



  public String getType() {

   return type;

  }



  public void setType(String type) {

   this.type = type;

  }

 }

  

Contents of MainApp are:

 package com.aid.autowireexample;



 import org.springframework.context.ApplicationContext;

 import org.springframework.context.support.ClassPathXmlApplicationContext;



 public class MainApp {

  public static void main(String[] args) {

   ApplicationContext context = new ClassPathXmlApplicationContext(

     "BeansAutowireAnnotation.xml");



   Product product = (Product) context.getBean("product");



   System.out.println("Product Name : " + product.getName());

   System.out.println("Price : " + product.getPrice());



   Type productType = product.getType();



   System.out.println(product.getName() + " is of type:"

     + productType.getType());

  }

 }


Contents of BeansAutowireAnnotation.xml are:

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:context="http://www.springframework.org/schema/context"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-3.2.xsd">



 <context:annotation-config />



 

 <bean id="product" class="com.aid.autowireexample.Product">

  <property name="name" value="ProductA" />

  <property name="price" value="400" />

 </bean>

 <bean id="type" class="com.aid.autowireexample.Type">

  <property name="type" value="Export" />



 </bean>



</beans>


We see that there is no relation between the two beans “product” and “type”. The @autowired annotation which we have used on the setter method in Product.java class, will automatically wire above beans on the basis of type.

Execute the code

The final step is run the application. Once all the above code is ready execute and the below output appears on the console:

Product Name : ProductA
Price : 400
ProductA is of type:Export

2. @Autowired On Properties

We can use @Autowired annotation for properties or fields. This helps us to get away with the setter methods. This is demostrated in the example below. I shall use the above example, only change made would be in the Product.java file, contents of this file are as below:


package com.aid.autowireexample;



import org.springframework.beans.factory.annotation.Autowired;



public class Product {

 private Integer price;

 private String name;

 @Autowired

 private Type type;



 public Integer getPrice() {

  return price;

 }



 public void setPrice(Integer price) {

  this.price = price;

 }



 public Type getType() {

  return type;

 }



 public String getName() {

  return name;

 }



 public void setName(String name) {

  this.name = name;

 }

}


Here we see that the @Autowired is used for the property “type” and no setter method is provided. When we pass values of autowired properties using , Spring will automatically assign those properties with the passed values or references.
If you execute the code now, the output would as below:

Product Name : ProductA
Price : 400
ProductA is of type:Export

3. @Autowired On Constructors

We can use @Autowired annotation for Constructors. The following example demonstrates this: I shall use the above example, only change made would be in the Product.java file. The contents of this file are :
package com.aid.autowireexample;



import org.springframework.beans.factory.annotation.Autowired;



public class Product {

 private Integer price;

 private String name;



 @Autowired

 public Product(Type type) {

  super();

  this.type = type;

                System.out.println("Inside Product constructor.");

 }



 private Type type;



 public Integer getPrice() {

  return price;

 }



 public void setPrice(Integer price) {

  this.price = price;

 }



 public Type getType() {

  return type;

 }



 public String getName() {

  return name;

 }



 public void setName(String name) {

  this.name = name;

 }

}




Execute the code and the output would be as below:

Inside Product constructor.
Product Name : ProductA
Price : 400
ProductA is of type:Export

4. @Autowired with arguments

The default behavior of of autowiring is to treat annotated methods, constructors, and fields as required dependencies. We can change this by turning off the default behavior by using (required=false) option with @Autowired as demonstrated below:

I shall use the same example, only changes would be made to Product.java and BeansAutowireAnnotation.xml files.

Contents of Product.java file are:


package com.aid.autowireexample;



import org.springframework.beans.factory.annotation.Autowired;



public class Product {

 private Integer price;

 private String name;



 @Autowired(required=false)

 private Type type;



 public Integer getPrice() {

  return price;

 }



 public void setPrice(Integer price) {

  this.price = price;

 }



 public Type getType() {

  return type;

 }



 public String getName() {

  return name;

 }



 public void setName(String name) {

  this.name = name;

 }

} 


The contents of BeansAutowireAnnotation.xml file are:
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:context="http://www.springframework.org/schema/context"

 xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd

    http://www.springframework.org/schema/context

    http://www.springframework.org/schema/context/spring-context-3.2.xsd">



 <context:annotation-config />



 

 <bean id="product" class="com.aid.autowireexample.Product">

  <property name="name" value="ProductA" />

  <property name="price" value="400" />

 </bean>

 <bean id="type" class="com.aid.autowireexample.Type">

  

 </bean>



</beans>


Here I’ve commented out the property field “type”. Now execute the code and the output would be:

Product Name : ProductA
Price : 400
ProductA is of type:null

Apart from the above, the @Autowired annotation can also be used for:

A field or method that expects an array of that type
For typed collections
For typed Maps (as long as the expected key type is String)
For interfaces that are well-known resolvable dependencies: BeanFactory, ApplicationContext, Environment, ResourceLoader, ApplicationEventPublisher, and MessageSource.

Spring Boot @ConfigurationProperties and Properties File

 In this tutorial, you will learn to use @ConfigurationProperties to map properties files to POJO classes in Spring Boot application. Let’s ...