You are on page 1of 5

Spring Auto-Wiring Beans

In Spring framework, you can wire beans automatically with auto-wiring feature. To enable it, just define the autowire attribute in <bean>.
<bean id="customer" class="com.mkyong.common.Customer" autowire="byName" />

In Spring, 5 Auto-wiring modes are supported.


no Default, no auto wiring, set it manually via ref attribute byName Auto wiring by property name. If the name of a bean is same as the name of other bean property, auto wire it. byType Auto wiring by property data type. If data type of a bean is compatible with the data type of other bean property, auto wire it. constructor byType mode in constructor argument. autodetect If a default constructor is found, use autowired by constructor; Otherwise, use autowire by type.

Examples
A Customer and Person object for auto wiring demonstration.
package com.mkyong.common; public class Customer { private Person person; public Customer(Person person) { this.person = person; } public void setPerson(Person person) { this.person = person; } //... } package com.mkyong.common; public class Person { //... }

1. Auto-Wiring no
This is the default mode, you need to wire your bean via ref attribute.
<bean id="customer" class="com.mkyong.common.Customer"> <property name="person" ref="person" /> </bean> <bean id="person" class="com.mkyong.common.Person" />

2. Auto-Wiring byName
Auto-wire a bean by property name. In this case, since the name of person bean is same with the name of the customer beans property (person), so, Spring will auto wired it via setter method setPerson(Person person).
<bean id="customer" class="com.mkyong.common.Customer" autowire="byName" /> <bean id="person" class="com.mkyong.common.Person" />

See full example Spring Autowiring by Name.

3. Auto-Wiring byType
Auto-wire a bean by property data type. In this case, since the data type of person bean is same as the data type of the customer beans property (Person object), so, Spring will auto wired it via setter method setPerson(Person person).
<bean id="customer" class="com.mkyong.common.Customer" autowire="byType" /> <bean id="person" class="com.mkyong.common.Person" />

See full example Spring Autowiring by Type.

4. Auto-Wiring constructor
Auto-wire a bean by property data type in constructor argument. In this case, since the data type of person bean is same as the constructor argument data type in customer beans

property (Person object), so, Spring auto wired it via constructor method public Customer(Person person).
<bean id="customer" class="com.mkyong.common.Customer" autowire="constructor" /> <bean id="person" class="com.mkyong.common.Person" />

See full example Spring Autowiring by Constructor.

5. Auto-Wiring autodetect
If a default constructor is found, uses constructor; Otherwise, uses byType. In this case, since there is a default constructor in Customer class, so, Spring auto wired it via constructor method public Customer(Person person).
<bean id="customer" class="com.mkyong.common.Customer" autowire="autodetect" /> <bean id="person" class="com.mkyong.common.Person" />

See full example Spring Autowiring by AutoDetect.


Note

Its always good to combine both auto-wire and dependency-check together, to make sure the property is always auto-wire successfully.
<bean id="customer" class="com.mkyong.common.Customer" autowire="autodetect" dependency-check="objects /> <bean id="person" class="com.mkyong.common.Person" />

Conclusion
In my view, Spring auto-wiring make development faster with great costs it added complexity for the entire bean configuration file, and you dont even know which bean will auto wired in which bean. In practice, i rather wire it manually, it is always clean and work perfectly, or better uses @Autowired annotation, which is more flexible and recommended.

BENEFITS of Spring MVC over Struts


Spring is a powerful Java application framework, used in a wide range of Java applications. It provides enterprise services to Plain Old Java Objects (POJOs). Spring uses dependency injection to achieve simplification and increase testability. 1. Spring provides a very clean division between controllers, JavaBean models, and views. 2. Springs MVC is very flexible. Unlike Struts, which forces your Action and Form objects into concrete inheritance (thus taking away your single shot at concrete inheritance in Java), Spring MVC is entirely based on interfaces. Furthermore, just about every part of the Spring MVC framework is configurable via plugging in your own interface. Of course we also provide convenience classes as an implementation option. 3. Spring, like WebWork, provides interceptors as well as controllers, making it easy to factor out behavior common to the handling of many requests. 4. Spring MVC is truly view-agnostic. You dont get pushed to use JSP if you dont want to; you can use Velocity, XLST or other view technologies. If you want to use a custom view mechanism for example, your own templating language you can easily implement the Spring View interface to integrate it. 5. Spring Controllers are configured via IoC like any other objects. This makes them easy to test, and beautifully integrated with other objects managed by Spring. 6. Spring MVC web tiers are typically easier to test than Struts web tiers, due to the avoidance of forced concrete inheritance and explicit dependence of controllers on the dispatcher servlet. 7. The web tier becomes a thin layer on top of a business object layer. This encourages good practice. Struts and other dedicated web frameworks leave you on your own in implementing your business objects; Spring provides an integrated framework for all tiers of your application. 8. No ActionForms. Bind directly to domain objects 9. More testable code (validation has no dependency on Servlet API)

10. Struts imposes dependencies on your Controllers (they must extend a Struts class), Spring doesnt force you to do this although there are convenience Controller implementations that you can choose to extend. 11. Spring has a well defined interface to business layer 12. Spring offers better integration with view technologies other than JSP (Velocity / XSLT / FreeMarker / XL etc.)

You might also like