Spring 在靜態工具類中使用註解注入bean

問題

最近在項目中遇到這樣一個情況:有一個發送郵件的工具類。在這個工具類中提供了幾種靜態方法,靜態方法需要另外一個類的實例提供處理。在static方法裏調用注入進來的service,因爲是靜態方法,所以必須聲明該service也必須是static的,這時候發現注入不進來,會報空指針錯誤。

解決

在網上查閱了資料後有幾種解決方案,參考http://blog.sina.com.cn/s/blog_6e2d53050102wl3x.html

@Component
public class MailUtils {
    @Autowired //注意這裏非靜態
    private  SysConfigService sysConfigService;
    private static MailUtils mailUtils;

    private static final Logger logger = LoggerFactory.getLogger(MailUtils.class);
    private static String SEND_USER_NAME;
    private static String SEND_USER_ADDRESS;
    private static String SEND_USER_PASSWORD;
    private static String SMTP_PORT;
    private static String SMTP_SERVER_ADDRESS;
    private static String ACCEPT_USERS_ADDRES;
    private static String ERROR_LOG_SUBJECT;

    @PostConstruct //@PostConstruct修飾的方法會在服務器加載Servle的時候運行,並且只會被服務器執行一次。PostConstruct在構造函數之後執行,init()方法之前執行
    public void init() {
        mailUtils = this;
        mailUtils.sysConfigService = this.sysConfigService;
        //讀取配置文件中的信息
        try {
            Map<String, String> sysConfigList = mailUtils.sysConfigService.findSysConfigList();
            SEND_USER_NAME = sysConfigList.get( "SEND_USER_NAME" );
            SEND_USER_ADDRESS = sysConfigList.get( "SEND_USER_ADDRESS" );
            SEND_USER_PASSWORD = sysConfigList.get( "SEND_USER_PASSWORD" );
            SMTP_PORT = sysConfigList.get( "SMTP_PORT" );
            SMTP_SERVER_ADDRESS = sysConfigList.get( "SMTP_SERVER_ADDRESS" );
            ACCEPT_USERS_ADDRES = sysConfigList.get( "ACCEPT_USERS_ADDRES" );
            ERROR_LOG_SUBJECT = sysConfigList.get( "ERROR_LOG_SUBJECT" );
        } catch(Exception e) {
            e.printStackTrace();
            logger.error(e.getMessage(),e);
        }
    }

    //發送郵件
     public static void sendEmail(String email, String subject, String body) {
        //...
    }
}

@PostConstruct和@PreDestroy。這兩個註解被用來修飾一個非靜態的void()方法.被@PostConstruct修飾的方法會在服務器加載Servle的時候運行,並且只會被服務器執行一次。(注意:如果修改數據庫中郵件的配置信息,項目中並不能立即生效。這個時候需要重新啓動項目才行。)PostConstruct在構造函數之後執行,init()方法之前執行。PreDestroy()方法在destroy()方法執行執行之後執行。

還有一種解決方案時通過Spring配置文件,就不列舉出來了。原理都是一樣的

發佈了29 篇原創文章 · 獲贊 46 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章