Bean wiring corresponds to providing the dependencies a bean might need to complete it’s job. In Spring, beans can be wired together in two ways : Manually and Autowiring.
Manual wiring : using ref
attribute in <property> or <constructor> tag
In this approach, we use the ‘ref’ attribute to refer to exact bean we want to be wired. This is the cleanest approach, and easy to understand
<!-- default example (autowire="no") --> <bean id="driver" class="com.websystique.spring.domain.Driver"> <property name="license" ref="license"/> </bean> <bean id="license" class="com.websystique.spring.domain.License" > <property name="number" value="123456ABCD"/> </bean>
Autowiring : using autowire
attribute in <bean> tag
<bean id="application" class="com.websystique.spring.domain.Application" autowire="byName"/>
In this approach, beans can be automatically wired using Spring autowire feature. There are 4 supported options for autowiring.
autowire="byName"
: Autowiring using property name. If a bean found with same name as the property of other bean, this bean will be wired into other beans propertyautowire="byType"
: If a bean found with same type as the type of property of other bean, this bean will be wired into other beans propertyautowire="constructor"
: If a bean found with same type as the constructor argument of other bean, this bean will be wired into other bean constructorautowire="no"
: No Autowiring. Same as explicitly specifying bean using ‘ref’ attribute
Let’s discuss each autowiring with an example:
1. autowire=”byName” example
Define Beans to work with
package com.websystique.spring.domain; public class Application { private ApplicationUser applicationUser; public ApplicationUser getApplicationUser() { return applicationUser; } public void setApplicationUser(ApplicationUser applicationUser) { this.applicationUser = applicationUser; } @Override public String toString() { return "Application [applicationUser=" + applicationUser + "]"; } }
package com.websystique.spring.domain; public class ApplicationUser { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "ApplicationUser [name=" + name + "]"; } }
Application needs ApplicationUser dependency, and have a property named applicationUser.
Spring Configuration XML file
<?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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- byName example --> <bean id="application" class="com.websystique.spring.domain.Application" autowire="byName"/> <bean id="applicationUser" class="com.websystique.spring.domain.ApplicationUser" > <property name="name" value="superUser"/> </bean> </beans>
Notice that we have set the autowire="byName"
attribute. We are nowhere referring to applicationUser bean explicitly. Since ‘application’ class have a property name ‘applicationUser’ which matches with the name of a bean defined in Spring context, that bean will be wired automatically.
Run Application
Load the context and run it.
package com.websystique.spring; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.websystique.spring.domain.Application; public class AppMain { public static void main(String args[]){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); //autowire=byName Application application = (Application)context.getBean("application"); System.out.println("Application Details : "+application); } }
Following will be the output:
Application Details : Application [applicationUser=ApplicationUser [name=superUser]]
2. autowire=”byType” example
Define Beans to work with
package com.websystique.spring.domain; public class Employee { private EmployeeAddress address; public EmployeeAddress getAddress() { return address; } public void setAddress(EmployeeAddress address) { this.address = address; } @Override public String toString() { return "Employee [address=" + address + "]"; } }
package com.websystique.spring.domain; public class EmployeeAddress { private String Street; private String city; public String getStreet() { return Street; } public void setStreet(String street) { Street = street; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } @Override public String toString() { return "EmployeeAddress [Street=" + Street + ", city=" + city + "]"; } }
Employee needs EmployeeAddress type dependency.
Spring Configuration XML file
<?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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- byType example --> <bean id="employee" class="com.websystique.spring.domain.Employee" autowire="byType"/> <bean id="employeeAddress" class="com.websystique.spring.domain.EmployeeAddress" > <property name="street" value="112/223,SantaVila"/> <property name="city" value="Nebraska"/> </bean> </beans>
Notice that we have set the autowire="byType"
attribute. We are nowhere referring to employeeAddress bean explicitly from employee. Since ’employee’ class have a property of type ‘EmployeeAddress’ which matches with the type of a bean ’employeeAddress’ defined in Spring context, that bean will be wired automatically.
Run Application
Load the context and run it.
package com.websystique.spring; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.websystique.spring.domain.Employee; public class AppMain { public static void main(String args[]){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); //autowire=byType Employee employee = (Employee)context.getBean("employee"); System.out.println("Employee Details : "+employee); } }
Following will be the output
Employee Details : Employee [address=EmployeeAddress [Street=112/223,SantaVila, city=Nebraska]]
3. autowire=”constructor” example
Define Beans to work with
package com.websystique.spring.domain; public class Performer { private Instrument instrument; public Performer(Instrument instrument){ this.instrument = instrument; } @Override public String toString() { return "Performer [instrument=" + instrument + "]"; } }
package com.websystique.spring.domain; public class Instrument { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Instrument [name=" + name + "]"; } }
Notice that ‘Performer’ class has a constructor which accepts a ‘Instrument’ type argument.
Spring Configuration XML file
<?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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- constructor example --> <bean id="performer" class="com.websystique.spring.domain.Performer" autowire="constructor"/> <bean id="instrument" class="com.websystique.spring.domain.Instrument" > <property name="name" value="PIANO"/> </bean> </beans>
Notice that we have set the autowire="constructor"
attribute. We are nowhere referring to instrument bean explicitly from performer. Since ‘performer’ class have a constructor which accepts an argument of type ‘Instrument’ which matches with the type of a bean ‘instrument’ defined in Spring context, that bean will be wired automatically.
Run Application
Load the context and run it.
package com.websystique.spring; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.websystique.spring.domain.Performer; public class AppMain { public static void main(String args[]){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); //autowire=constructor Performer performer = (Performer)context.getBean("performer"); System.out.println("Performer Details : "+performer); } }
Following will be the output
Performer Details : Performer [instrument=Instrument [name=PIANO]]
3. autowire=”no” example
Define Beans to work with
package com.websystique.spring.domain; public class Driver { private License license; public void setLicense(License license) { this.license = license; } public License getLicense() { return license; } @Override public String toString() { return "Driver [license=" + license + "]"; } }
package com.websystique.spring.domain; public class License { private String number; public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "License [number=" + number + "]"; } }
Notice that Driver have a dependency on License.
Spring Configuration XML file
<?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-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- default example (autowire="no") --> <bean id="driver" class="com.websystique.spring.domain.Driver" autowire="no"> <property name="license" ref="license"/> </bean> <bean id="license" class="com.websystique.spring.domain.License" > <property name="number" value="123456ABCD"/> </bean> </beans>
Notice that this time we have set autowire="no"
attribute. This autowire attribute have no effect anymore on bean wiring , and can be removed altogether.There is no more auto-wiring here.
Also notice that we have set the ref atttibute to refer to a specific bean. If we don’t do that, driver’s license property will be null.
Run Application.
Load the context and run it.
package com.websystique.spring; import org.springframework.context.support.AbstractApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.websystique.spring.domain.Driver; public class AppMain { public static void main(String args[]){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml"); //autowire=default Driver driver = (Driver)context.getBean("driver"); System.out.println("Driver Details : "+driver); } }
Following will be the output
Driver Details : Driver [license=License [number=123456ABCD]]
That’s it. In the next post we will see Autowiring using Annotation based approach.
Download Source Code
References
If you like tutorials on this site, why not take a step further and connect me on Facebook , Google Plus & Twitter as well? I would love to hear your thoughts on these articles, it will help improve further our learning process.