”;
Spring provides an option to inject dependency using factory-method attribute.
Example
The following example shows a class TextEditor that can only be dependency-injected using pure setter-based injection.
Let”s update the project created in Spring DI – Create Project chapter. We”re adding following files −
-
TextEditor.java − A class containing a SpellChecker as dependency.
-
SpellChecker.java − A dependency class.
-
MainApp.java − Main application to run and test.
Here is the content of TextEditor.java file −
package com.tutorialspoint; public class TextEditor { private SpellChecker spellChecker; private String name; public void setSpellChecker( SpellChecker spellChecker ){ this.spellChecker = spellChecker; } public SpellChecker getSpellChecker() { return spellChecker; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void spellCheck() { spellChecker.checkSpelling(); } }
Following is the content of another dependent class file SpellChecker.java −
This class constructor is private. So its object can not be created directly using new operator by other object. It has a static factory method to get an instance.
package com.tutorialspoint; public class SpellChecker { private SpellChecker(){ System.out.println("Inside SpellChecker constructor." ); } public static SpellChecker getInstance() { System.out.println("Inside SpellChecker getInstance." ); return new SpellChecker(); } public void checkSpelling(){ System.out.println("Inside checkSpelling." ); } }
Following is the content of the MainApp.java file −
package com.tutorialspoint; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationcontext.xml"); TextEditor te = (TextEditor) context.getBean("textEditor"); te.spellCheck(); } }
Following is the configuration file applicationcontext.xml which has configuration for autowiring byName −
<?xml version = "1.0" encoding = "UTF-8"?> <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"> <!-- Definition for textEditor bean --> <bean id = "textEditor" class = "com.tutorialspoint.TextEditor" autowire = "byName"> <property name = "name" value = "Generic Text Editor" /> </bean> <!-- Definition for spellChecker bean --> <bean id = "spellChecker" class = "com.tutorialspoint.SpellChecker" factory-method="getInstance"></bean> </beans>
Once you are done creating the source and bean configuration files, let us run the application. If everything is fine with your application, it will print the following message −
Inside SpellChecker getInstance. Inside SpellChecker constructor. Inside checkSpelling.
”;