在采用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定义日志对象,现在不使用,在调用方法层面上就由静态调用变成来动态调用,调用速度上会有损失。
如果发现这样做会有什么特别的问题,还请各位指正!
时间: 2024-10-09 20:22:44