Sunday, 2 June 2013

Spring Beans Autowiring

Spring Autowiring




We can wire beans automatically in spring framework by setting the autowire property. But for enabling this we have to define the “autowrire” attribute in the <bean> tag.

autowiring types/modes:-


Five flavors of autowiring are provided by spring framework.

no – It means no autowiring and we have to use bean reference for wiring explicitly. This is default setting.

byName – This autowire mode will help to autowire by property name. Spring container tries to find the properties of the beans on which autowire attribute is set to byName in the XML configuration file and then match and wire its properties with the beans defined with the similar names in the XML config bean file.

byType – This autowire mode will help to autowire by data type of the property. Spring container then tries to look at the bean properties on which autowire attribute is declared as byType in config file and then tries to match and wire a property if its data type matches with exactly atleast one bean. Exception will be thrown in case if more than one matched bean will be available.

constructor – similar to byType autowire mode in case of constructor arguments. Exception will be thrown in case if no exact bean of the constructor argument type in the spring container is available.

autodetect – Spring container first attempts to autowire by constructor  and then using byType in case if first attempt does not work(autowire by constructor).

Example of  "no" autowiring mode:-

System Requirements:-
  •          Eclipse Editor or any other.
  •          JDK 1.5 or higher(I am using jdk 1.7.0_03)
  •          Spring jars.
Required Jars are:-
  • spring-core.jar
  • spring-2.5.jar
  • spring-beans.jar
  • spring-context.jar
  • commons-logging.jar
  • dom4j-1.4.jar
  • antlr.jar
  • log4j.jar

Steps for creating Eclipse java project for implementing spring auto wiring :-
  • Create a java project in eclipse.
  • Create a package in the src folder with the name as com.spring.gaurav.autowire.no.example.
  • Create the below files in this package and place the corresponding code in those files.
  • Create an XML file and name it as autowire-mode-no-beans.xml and place this file in the classpath outside the srcfolder.
  • Execute the NoAutowireClient.java by selecting the option Run as Java Application.



ShoeCompanyDetails.java



packagecom.spring.gaurav.autowire.no.example;



public classShoeCompanyDetails {
            privateString shoeCompanyName;
            privateString companyType;
            privateString companyHeadquarters;
            privateint companyFoundationyear;

            publicString getShoeCompanyName() {
                        returnshoeCompanyName;
            }

            publicvoid setShoeCompanyName(String shoeCompanyName) {
                        this.shoeCompanyName = shoeCompanyName;
            }

            publicString getCompanyType() {
                        returncompanyType;
            }

            publicvoid setCompanyType(String companyType) {
                        this.companyType = companyType;
            }

            publicString getCompanyHeadquarters() {
                        returncompanyHeadquarters;
            }

            publicvoid setCompanyHeadquarters(String companyHeadquarters) {
                        this.companyHeadquarters = companyHeadquarters;
            }

            publicint getCompanyFoundationyear() {
                        returncompanyFoundationyear;
            }

            publicvoid setCompanyFoundationyear(int companyFoundationyear) {
                        this.companyFoundationyear = companyFoundationyear;
            }
}


Shoemaker.java

packagecom.spring.gaurav.autowire.no.example;

public classShoemaker {
            privateString companyFounder;
            privateShoeCompanyDetails shoeCompanyDetails;

            publicvoid displayShoemakerCompanyHistory() {
                        System.out.println("SHOE COMPANY NAME :- "
                                                + shoeCompanyDetails.getShoeCompanyName()
                                                + ", \nCOMPANYFOUNDER NAME :- " + companyFounder + ",");
                        System.out.println("COMPANY TYPE :- "
                                                + shoeCompanyDetails.getCompanyType()
                                                + ", \nCOMPANY HEADQUARTERS :- "
                                                + shoeCompanyDetails.getCompanyHeadquarters()
                                                + " \nAND COMPANY FOUNDATION YEAR :- "
                                                + shoeCompanyDetails.getCompanyFoundationyear());
            }

            publicString getCompanyFounder() {
                        returncompanyFounder;
            }

            publicvoid setCompanyFounder(String companyFounder) {
                        this.companyFounder = companyFounder;
            }

            publicShoeCompanyDetails getShoeCompanyDetails() {
                        returnshoeCompanyDetails;
            }

            publicvoid setShoeCompanyDetails(ShoeCompanyDetails shoeCompanyDetails) {
                        this.shoeCompanyDetails = shoeCompanyDetails;
            }

}

autowire-mode-no-beans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

            <bean id="shoemakerBean" class="com.spring.gaurav.autowire.no.example.Shoemaker"
                        autowire="no">
                        <property name="companyFounder" value="RUDOLF DASSLER" />
                        <property name="shoeCompanyDetails" ref="shoeCompanyDetailsBean"/>
            </bean>

            <bean id="shoeCompanyDetailsBean" class="com.spring.gaurav.autowire.no.example.ShoeCompanyDetails">
                        <property name="shoeCompanyName" value="PUMA SE" />
                        <property name="companyType" value="PUBLIC EU COMPANY" />
                        <property name="companyHeadquarters" value="HERZOGENAURACH, GERMANY" />
                        <property name="companyFoundationyear" value="1924"></property>
            </bean>

</beans>
 




NoAutowireClient.java



packagecom.spring.gaurav.autowire.no.example;



import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class NoAutowireClient {
            public static void main(String args[]) {
                        ApplicationContext appContext = new ClassPathXmlApplicationContext(
                                                "autowire-mode-no-beans.xml");
                        Shoemaker shoemaker = (Shoemaker) appContext.getBean("shoemakerBean");
                        shoemaker.displayShoemakerCompanyHistory();

            }
}

/**
 * Notes: According to "autowire-mode-no-beans.xml" bean file, we called
 * shoemakerBean in this client program, In the xml bean configuration file, we
 * have declared autowire = no, It means we don't want autowiring so according
 * to the no autowire mode we have to use bean reference for wiring explicitly
 * as we have declared private ShoeCompanyDetails shoeCompanyDetails in
 * Shoemaker.java file, so we have to provide ShoeCompanyDetails class reference
 * to Shoemaker class in the XML configuration file. Then container injects
 * ShoeCompanyDetails class properties which is shoeCompanyName, companyType,
 * companyHeadquarters and companyFoundationyear and injects value of
 * companyFounder property of Shoemaker class.
 *
 */
 

Result:-

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.

SHOE COMPANY NAME :- PUMA SE,
COMPANYFOUNDER NAME :- RUDOLF DASSLER,
COMPANY TYPE :- PUBLIC EU COMPANY,
COMPANY HEADQUARTERS :- HERZOGENAURACH, GERMANY
AND COMPANY FOUNDATION YEAR :- 1924


Back to Interview Questions 

No comments:

Post a Comment