[spring]從頭開始-BeanNameAware
開發工具:IntelliJ IDEA 13
開發環境:jdk1.6.0_45
Framework:spring 3
嗯?如果要記錄整個程式的運作,最常用的應該是 org.apache.commons.logging 吧?
在spring 如果要記錄一個bean的名稱,可以在spring 產生該bean的實體之後,就立即把訊息記錄下來,我們可以手動自己寫在 init-method 當中,不過如果bean的數量一多,我們可以採用implement BeanNameAware 這個介面,來幫我們省一點功夫,底下就是範例:
LoggingBean.java
package foo.bar;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.BeanNameAware;
/**
* Created by Hsu on 2014/7/15.
*/
public class LoggingBean implements BeanNameAware {
//Log 實體
private static final Log log = LogFactory.getLog(LoggingBean.class);
private String beanName = null;
//複寫setBeanName 這個方法,並記錄起來
@Override
public void setBeanName(String beanName) {
this.beanName = beanName;
}
public void someOperation() {
if(log.isInfoEnabled()) {
log.info("Bean [" + beanName + "] - someOperation()");
}
}
}
配置檔 spring-config.xml
..
..標頭的部分省略
<bean id="loggingBean" class="foo.bar.LoggingBean"/>
..結尾省略
實現演繹的類別:
LoggingBeanExample.java
package foo.bar;
import org.springframework.context.support.GenericXmlApplicationContext;
/**
* Created by Hsu on 2014/7/15.
*/
public class LoggingBeanExample {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.load("classpath:spring-config.xml");
ctx.refresh();
LoggingBean bean = (LoggingBean) ctx.getBean("loggingBean");
bean.someOperation();
}
}
Log 需要的 log4j.properties
先設置成這樣:
log4j.rootLogger=DEBUG, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d [%-5p] %c - %m%n
接著可以執行看看結果,會發現程式運作時就會透過Log將所有訊息記錄下來,而我們自己手動加的動作也有正常去執行:
...前略
2014-07-21 13:16:09,047 [INFO ] foo.bar.LoggingBean - Bean [loggingBean] - someOperation()
至於 log4j.properties 的相關設定往上已經有相當多詳細的教學文了,這裡就不再贅述