Java Reference
In-Depth Information
Where should you make a call to the openFile() method for initialization? In Java, the initialization
tasks should be performed in the constructor. But would it work here if you call the openFile() method
in the default constructor of the Cashier class? No, because the openFile() method requires both the
name and path properties to be set before it can determine which file to open.
package com.apress.springenterpriserecipes.shop;
...
public class Cashier {
...
public void openFile() throws IOException {
File logFile = new File( path, name + ".txt");
writer = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(logFile, true)));
}
}
When the default constructor is invoked, these properties have not been set yet. So you may add a
constructor that accepts the two properties as arguments, and call the openFile() method at the end of
this constructor. However, sometimes you might not be allowed to do so, or you might prefer to inject
your properties via setter injection. Actually, the best time to call the openFile() method is after all
properties have been set by the Spring IoC container.
Implementing the InitializingBean and DisposableBean Interfaces
Spring allows your bean to perform initialization and destruction tasks in the callback methods
afterPropertiesSet() and destroy() by implementing the InitializingBean and DisposableBean
interfaces. During bean construction, Spring will notice that your bean implements these interfaces
and call the callback methods at a suitable time.
package com.apress.springenterpriserecipes.shop;
...
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class Cashier implements InitializingBean, DisposableBean {
...
public void afterPropertiesSet() throws Exception {
openFile();
}
public void destroy() throws Exception {
closeFile();
}
}
Now if you run your Main class again, you will see that a checkout record is appended to the text file
c:/cashier/cashier1.txt . However, implementing such proprietary interfaces will make your beans
Spring-specific and thus unable to be reused outside the Spring IoC container.
Setting the init-method and destroy-method Attributes
A better approach of specifying the initialization and destruction callback methods is by setting the
init-method and destroy-method attributes in your bean declaration.
Search WWH ::




Custom Search