February 11, 2022

Spring @Autowired Annotation

Spring @Autowired annotation is used to automatically inject dependencies.

Where to apply @Autowired annotation

  • You can apply the @Autowired annotation to setter methods. See example.
  • You can apply the @Autowired annotation to constructors. See example.
  • You can apply @Autowired to fields. See example.
  • You can also apply the annotation to methods with arbitrary names and multiple arguments. See example.

Enabling @Autowired annotation

To enable autowiring using @Autowired annotation ‘AutowiredAnnotationBeanPostProcessor’ class has to be registered. You can provide bean definition for it directly, though that is seldom needed.

<bean class = "org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

By using <context:annotation-config> element or using <context:component-scan> element (which implicitly enables the functionality of <context:annotation-config> element) AutowiredAnnotationBeanPostProcessor class is registered automatically. This is the preferred way to enable it.

Spring @Autowired annotation example

In the example there is a class to place order called OrderService and purchase can be done from a Store. In OrderService class dependency for store has to be autowired. Using these classes we’ll see how to use @Autowired with constructor, setter, field or arbitrary method.

Using @Autowired annotation on setter

When @Autowired annotation is applied on a setter method it is equivalent to autowiring = "byType" in case of XML configuration.

public interface IStore {
  public void doPurchase();
}
import org.springframework.stereotype.Service;
 
@Service
public class RetailStore implements IStore {
  public void doPurchase() {
    System.out.println("Doing purchase from Retail Store");
  }
}
public interface OrderService {
  public void buyItems();
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class OrderServiceImpl implements OrderService {
  private IStore store;
  // Autowired on Setter
  @Autowired
  public void setStore(IStore store) {
    this.store = store;
  }
  public void buyItems() {
    store.doPurchase();
  }
}

Here you can see that the dependency on Store is satisfied by using @Autowired annotation on the setStore() method.

XML Configuration
<?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.xsd
          http://www.springframework.org/schema/context
          http://www.springframework.org/schema/context/spring-context.xsd">
          
    <context:component-scan base-package="com.knpcode.springproject.service" />
</beans>

Using @Autowired annotation on constructor

@Autowired annotation on a bean’s constructor is equivalent to autowiring="constructor" in case of XML configuration.

@Service
public class OrderServiceImpl implements OrderService {
  private IStore store;
  // Autowired on constructor
  @Autowired
  public OrderServiceImpl(IStore store){
    this.store = store;
  }
  public void buyItems() {
    store.doPurchase();
  }
}

Using @Autowired annotation on field

@Autowired annotation on a field is equivalent to autowiring="byType" in autowiring using configuration file.

@Service
public class OrderServiceImpl implements OrderService {
  // Autowiring on a field
  @Autowired
  private IStore store;

  public void buyItems() {
    store.doPurchase();
  }
}

Using @Autowired annotation on arbitrary methods

You can also apply the annotation to methods with arbitrary names and multiple arguments. Each of those arguments will be autowired with a matching bean in the Spring container.

@Service
public class OrderServiceImpl implements OrderService {
  private IStore store;
  // Autowiring on a method
  @Autowired
  public void prepare(IStore store) {
    this.store = store;
  }
  public void buyItems() {
    store.doPurchase();
  }
}

That's all for the topic Spring @Autowired Annotation. If something is missing or you have something to share about the topic please write a comment.


You may also like

No comments:

Post a Comment