Engineering Full Stack Apps with Java and JavaScript
Inversion of control (IoC) is an object oriented programming technique in which object coupling is bound at run time by an assembler object and is typically not known at compile time. This binding process is usually achieved through dependency injection. You can achieve this by designing to interfaces. Read more @ www.javajee.com/inversion-of-control-and-dependency-injection.
If you are not following the tutorials in order, please refer to www.javajee.com/your-first-spring-program for the setup and spring.xml file used in this example. We have a simple class, JJWriter.java, with a single method write and two subclasses of this writer class – JJDatabaseWriter.java and JJFileWriter.java – both overriding the write method. These three classes are regular java classes with no spring special code.
If we had directly created an instance of an FileWriter as FileWriter writer = new FileWriter(), and later, if you plan to use DatabaseWriter instead of FileWriter, you have to change your code. But if you use a Writer reference and the actual subclass (FileWriter, DatabaseWriter, FtpWriter etc) instance is supplied using a dependency injection, you will only need to change the XML files, but not anything in the code.
The JJWriter.java
package com.javajee.spring;
public class JJWriter {
public void write() {
System.out.println("Default Writer");
}
}
JJDatabaseWriter.java
package com.javajee.spring;
public class JJDatabaseWriter extends JJWriter {
@Override
public void write() {
System.out.println("Writing to Database!!!");
}
}
JJFileWriter.java
package com.javajee.spring;
public class JJFileWriter extends JJWriter {
@Override
public void write() {
System.out.println("Writing to file!!!");
}
}
We have configured JJWriter in the spring config xml as a bean (in the previous tutorial):
<bean id="jjwriter" class="com.javajee.spring.JJFileWriter">
</bean>
Within our main class, JJWriterMain.java (from previous tutorial), we ask spring to create and return us an object of the class type defined using the class attribute of the bean using the bean id:
public class JJWriterMain {
public static void main(String[] args) {
AbstractApplicationContext context= new ClassPathXmlApplicationContext("spring.xml");
JJWriter writer = (JJWriter)context.getBean("jjwriter");
writer.write();
context.close();
}
}
If you run this program now, you can see the output as:
Default Writer
Now, if I need to use a JJDatabaseWriter object, all I have to do is to change the bean definition in the spring.xml file as:
<bean id="jjwriter" class="com.javajee.spring.JJDatabaseWriter">
</bean>
If you run the same JJWriterMain now, you can see the output as:
Writing to Database!!!
Similarly, if I need to use a JJFileWriter object, all I have to do is to change the bean definition in the spring.xml file as:
<bean id="jjwriter" class="com.javajee.spring.JJFileWriter ">
</bean>
If you run the same JJWriterMain now, you can see the output as:
Writing to file!!!
You can now change the actual object created at runtime just by changing an xml file.
We will see Property Initialization (Setter Injection) and Constructor Injection next.
Comments
is it possible to run a
is it possible to run a spring program only with cmd and .jar file installed ?
if you can run a java program
if you can run a java program using cmd, you can do spring also. please try it out and let me know if you face any issues.