Spicy Spring : Different ways of Autowiring
I would like to show different ways of using Spring's @Autowired annotation: Constructor, Method and Field autowiring.
The examples I show are all a form of byType autowiring mode (constructor autowiring mode is Analogous to byType). Take a look at the Spring Reference guide for more information on the Autowiring modes.
Constructor Autowiring
Create a constructor with a dependent bean as constructor parameter and add the @Autowired annotation to the constructor. A big advantage of autowiring by constructor is that the field can be made final, and therefore may not be changed after construction.
package com.jdriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AutowiredCapabilityBean
{
//The InjectableBean can be made final
private final InjectableBean injectableBean;
//The InjectableBean is autowired byType and is required.
//An error is thrown when no bean or multiple beans of InjectableBean exist
@Autowired
public AutowiredCapabilityBean(InjectableBean injectableBean) {
this.injectableBean = injectableBean;
}
}
Method Autowiring
Create a setter method for the dependent bean and add the @Autowired annotation to the setter method. A disadvantage of using Method autowiring is that the setter can be called in production code, overriding the bean accidentally.
package com.jdriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AutowiredCapabilityBean
{
private InjectableBean injectableBean;
//No explicit constructor is needed. The default constructor is used.
//The InjectableBean is autowired byType, but is not required.
@Autowired
public void setInjectableBean(InjectableBean injectableBean) {
this.injectableBean = injectableBean;
}
}
Field Autowiring
Create a field (member variable) for the dependent bean and add the @Autowired annotation to the field. This way of Autowiring has less code, but takes more effort to test the AutowiredCapabilityBean with an implementation of the InjectableBean, since there is no constructor and no setter for it.
package com.jdriven;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class AutowiredCapabilityBean
{
//The InjectableBean is autowired byType and is required.
@Autowired
private InjectableBean injectableBean;
//No explicit constructor is needed. The default constructor is used.
}