In Spring, “Autowiring by Type” means, if data type of a bean is compatible with the data type of other bean property, auto wire it.
For example, a “person” bean exposes a property with data type of “ability” class, Spring will find the bean with same data type of class “ability” and wire it automatically. And if no matching found, just do nothing.
You can enable this feature via autowire="byType"
like below :
<!-- person has a property type of class "ability" --> <bean id="person" class="com.tuts.heomi.netmon.Person" autowire="byType" /> <bean id="invisible" class="com.tuts.heomi.netmon.Ability" > <property name="skill" value="Invisible" /> </bean>
See a full example of Spring auto wiring by type.
1. Beans
Two beans, person and ability.
package com.tuts.heomi.netmon; public class Ability { private String skill; public String getSkill() { return skill; } public void setSkill(String skill) { this.skill = skill; } @Override public String toString() { return "Ability [skill=" + skill + "]"; } }
package com.tuts.heomi.netmon; public class Person { private Ability ability; public Ability getAbility() { return ability; } public void setAbility(Ability ability) { this.ability = ability; } @Override public String toString() { return "Person [ability=" + ability + "]"; } }
2. Spring Wiring
Normally, you wire the bean explicitly :
<bean id="person" class="com.tuts.heomi.netmon.Person"> <property name="ability" ref="invisible" /> </bean> <bean id="invisible" class="com.tuts.heomi.netmon.Ability" > <property name="skill" value="Invisible" /> </bean>
Output
Person [ability=Ability [skill=Invisible]]
With autowire by type enabled, you can leave the ability property unset. Spring will find the same data type and wire it automatically.
<bean id="person" class="com.tuts.heomi.netmon.Person" autowire="byType" /> <bean id="invisible" class="com.tuts.heomi.netmon.Ability" > <property name="skill" value="Invisible" /> </bean>
Output
Person [ability=Ability [skill=Invisible]]
Wait, what if you have two beans with same data type of class “ability”?
<bean id="person" class="com.tuts.heomi.netmon.Person" autowire="byType" /> <bean id="steal" class="com.tuts.heomi.netmon.Ability" > <property name="skill" value="Steal" /> </bean> <bean id="invisible" class="com.tuts.heomi.netmon.Ability" > <property name="skill" value="Invisible" /> </bean>
Output
Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException:
...
No unique bean of type [com.tuts.heomi.netmon.Ability] is defined:
expected single matching bean but found 2: [steal, invisible]; nested exception is
org.springframework.beans.factory.NoSuchBeanDefinitionException:
No unique bean of type [com.tuts.heomi.netmon.Ability] is defined:
expected single matching bean but found 2: [steal, invisible]
In this case, you will hits the UnsatisfiedDependencyException
error message.
Note
In autowiring by type mode, you just have to make sure only one unique data type of bean is declared.
Download Source Code
$ git clone https://github.com/favtuts/java-spring-tutorials.git
$ cd SpringAutoWiringByType