在采用Spring mvc+org.slf4j.Logger開發項目時,發現幾乎每個controller或者manager都有的一個標配:
private final static Logger LOGGER = LoggerFactory.getLogger(Test.class);
看起來並沒有什么問題,但是毫無疑問的是,每新建一個controller或者manager就需要寫一次幾乎相同的代碼會間接降低效率,另外因為每個controller或者manager都有一個這樣的日志對象,無疑會增加內存的消耗,那么有沒有什么辦法平衡性能與效率的方式呢?
如果稍微深入過java基礎的話,會知道java的特性之一:多態。簡而言之,就是它允許基類的指針或引用指向派生類的對象,而在具體訪問時實現方法的動態綁定。
下面直接附上結果:
1 @Controller 2 public class BaseController { 3 public final Logger logger = LoggerFactory.getLogger(this.getClass()); 4 }
1 @Controller 2 @RequestMapping("/test") 3 public class TestController extends BaseController { 4 @RequestMapping("/") 5 public void test(){ 6 logger.error("日志對象logger復用測試"); 7 } 8 }
簡單解釋下,先建一個基礎控制層BaseController,然后新建一個業務Controller,並且繼承於BaseController,在這個業務控制層中的一個requestmapping中使用BaseController中的logger日志對象來簡單打印測試語句。
運行后,我們會發現日志打印出來的對象指向的是TestController而不是BaseController,即BaseController中的this.getClass()的this指向的是子類TestController。
這樣,只要在BaseController中定義一次日志對象,后續業務控制層就不需要每次都定義日志對象,這就是利用多態的效果。
當然,這樣做雖然會減少代碼量,但是也會有壞處,即:原來使用static定義日志對象,現在不使用,在調用方法層面上就由靜態調用變成來動態調用,調用速度上會有損失。
如果發現這樣做會有什么特別的問題,還請各位指正!