[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 的相關設定往上已經有相當多詳細的教學文了,這裡就不再贅述

demo程式(右鍵另開視窗下載)