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.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | 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.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 | 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.
01 02 03 04 05 06 07 08 09 10 11 12 13 14 | 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. } |
Reference: | Spicy Spring : Different ways of Autowiring from our JCG partner Willem Cheizoo at the JDriven blog. |