1. 程式人生 > >Spring 在靜態工具類中使用註解注入bean

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

問題

最近在專案中遇到這樣一個情況:有一個傳送郵件的工具類。在這個工具類中提供了幾種靜態方法,靜態方法需要另外一個類的例項提供處理。在static方法裡呼叫注入進來的service,因為是靜態方法,所以必須宣告該service也必須是static的,這時候發現注入不進來,會報空指標錯誤。

解決

@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配置檔案,就不列舉出來了。原理都是一樣的