In the post Executing code on the creation or destruction of a bean in Spring I explain three ways to execute code on the creation or destruction of a Bean in Spring.
With two of these ways you can set the execution of a specific custom method:
- with the annotations @PostConstruct and @PreDestroy
- configuring the properties init-method and destroy-method
There is a very convenient way in the case that more beans have methods with the same name to be executed on their creation and destruction, i.e. you can specify a default method for all the beans.
For example see the following java project:
- create the file conf/app-context.xml
12345678910111213141516]<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"default-lazy-init="true"default-init-method="defaultInit"default-destroy-method="defaultDestroy" ><context:annotation-config/><bean id="simpleBean" class="eu.lucazanini.mybean.SimpleBean"scope="singleton" /></beans>
where the default methods are set in the highlighted lines;
the folder “conf” must be in the classpath - create the file conf/log4j.xml
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration PUBLIC "-//LOGGER" "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="stdout" class="org.apache.log4j.ConsoleAppender"><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%d %-5p %c{1}:%L %m %n" /><!--ConversionPattern format specification%d inserts the date; you can specify the format (%d{yyyy-MM-dd HH:mm:ss,SSS})%-5p inserts the priority log level, 5 characters, left justified%c{1} inserts the name of the class%L inserts the line number%m inserts the user message%n inserts the separator (for example, a new line)--></layout></appender><appender name="fileAppender" class="org.apache.log4j.RollingFileAppender"><param name="append" value="false" /><param name="Threshold" value="DEBUG" /><param name="File" value="logs/app.log"/><param name="MaxFileSize" value="512KB" /><param name="MaxBackupIndex" value="10" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%d %-5p %c{1}:%L %m %n" /></layout></appender><!--sets the priority log level for org.springframework--><logger name="org.springframework"><level value="info"/></logger><!--sets the priority log level for eu.lucazanini--><logger name= "eu.lucazanini"><level value="debug"/></logger><!--sets the default priority log level--><root><priority value="debug"></priority><appender-ref ref="stdout"/><appender-ref ref="fileAppender"/></root></log4j:configuration> - create the file eu/lucazanini/mybean/Main.java
123456789101112131415161718192021222324252627package eu.lucazanini.mybean;import org.apache.log4j.Logger;import org.springframework.context.support.*;public class Main {private static org.apache.log4j.Logger log = Logger.getLogger(Main.class);public static void main(String[] args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:app-context.xml");ctx.refresh();log.debug("creating bean");SimpleBean bean = (SimpleBean) ctx.getBean("simpleBean");log.debug("created bean");log.debug("destroying bean");ctx.destroy();log.debug("destroyed bean");log.debug("application shutdown");}} - create the file eu/lucazanini/mybean/SimpleBean.java
12345678910111213141516171819202122]package eu.lucazanini.mybean;import org.apache.log4j.Logger;public class SimpleBean {private static org.apache.log4j.Logger log = Logger.getLogger(SimpleBean.class);public SimpleBean() {log.debug("constructor");}public void defaultInit() {log.debug("defaultInit-method");}public void defaultDestroy() {log.debug("defaultDestroy-method");}}
where the default methods are highlighted
The output is the following:
1 2 3 4 5 6 7 8 9 10 |
]... DEBUG Main:[...] creating bean DEBUG SimpleBean:[...] constructor DEBUG SimpleBean:[...] defaultInit-method DEBUG Main:[...] created bean DEBUG Main:[...] destroying bean ... DEBUG SimpleBean:[...] defaultDestroy-method DEBUG Main:[...] destroyed bean DEBUG Main:[...] application shutdown |