从iBATIS Hibernate 去日志依赖 看 模块化Java

本文探讨了Java模块化的基本概念及其实现方式,特别是如何通过模块化减少不必要的依赖。以Hibernate和iBATIS为例,介绍了一种通过定义通用接口和使用条件依赖管理来降低对日志库依赖的方法。

前几天看了一篇文章,名为模块化Java简介 。模块化的思想就是去耦合,这样在升级或者维护的时候都会方便一些,这样的道理大家都知道,但是怎样在实现中完成这一点呢。


作者在“类库也是模块”这一节中介绍了“类库毫无疑问也是模块。对于类库来讲,可能没有一个单一接口与之通信,但往往却有‘public ’ API(可能被用到)和‘private ’ package(文档中说明了其用途)。此外,它们也有自己依赖的类库(比如JMXJMS )。这将引起自动依赖管理器引入许多并非必须的类库:以Log4J-1.2.15 为例,引入了超过10个依赖类库(包括javax.mail和javax.jms),尽管这些类库中有不少对于使用Log4J的程序来说根本不需要。 即要做到,某些情况下,一个模块的依赖可以是可选的。”

 

虽然文章的其他部分看不太懂,但是这个内容倒是可以考察的。Hibernate和iBATIS[注:这里使用的是iBATIS2作为示例]中的日志模块都是与他们的类库模块分开的,那么他们是怎么做到的呢?

 

Hibernate用的是Apache Commons Logging 开源工具做到的,而iBATIS用的其实就是自己实现的一个简化的Apache Commons Logging:

首先使用定义一个通用的接口,自己在程序中使用的就是这样一个接口:

package com.ibatis.common.logging;

public interface Log {
  boolean isDebugEnabled();
  void error(String s, Throwable e);
  void error(String s);
  public void debug(String s);
  public void warn(String s);
}

 


LogFactory 是用来生成这个Log接口实现的工厂类

package com.ibatis.common.logging;

import java.lang.reflect.Constructor;
import com.ibatis.common.resources.Resources;

public class LogFactory {

  private static Constructor logConstructor;

  static {
    tryImplementation("org.apache.commons.logging.LogFactory", "com.ibatis.common.logging.jakarta.JakartaCommonsLoggingImpl");
    tryImplementation("org.apache.log4j.Logger", "com.ibatis.common.logging.log4j.Log4jImpl");
    tryImplementation("java.util.logging.Logger", "com.ibatis.common.logging.jdk14.Jdk14LoggingImpl");
    tryImplementation("java.lang.Object", "com.ibatis.common.logging.nologging.NoLoggingImpl");
  }

  private static void tryImplementation(String testClassName, String implClassName) {
    if (logConstructor == null) {
      try {
        Resources.classForName(testClassName);
        Class implClass = Resources.classForName(implClassName);
        logConstructor = implClass.getConstructor(new Class[]{Class.class});
      } catch (Throwable t) {
      }
    }
  }

  public static Log getLog(Class aClass) {
    try {
      return (Log)logConstructor.newInstance(new Object[]{aClass});
    } catch (Throwable t) {
      throw new RuntimeException("Error creating logger for class " + aClass + ".  Cause: " + t, t);
    }
  }
}
 



Log4jImpl 是Log 接口的一个实例类,用来实现与log4j的交互

package com.ibatis.common.logging.log4j;

import org.apache.log4j.Logger;

public class Log4jImpl implements com.ibatis.common.logging.Log {

  private Logger log;

  public Log4jImpl(Class clazz) {
     log = Logger.getLogger(clazz);
  }

  public boolean isDebugEnabled() {
    return log.isDebugEnabled();
  }

  public void error(String s, Throwable e) {
    log.error(s, e);
  }
  ......
}
 


注意到这里最终还是使用了log4j的接口 import org.apache.log4j.Logger;所以说明该jar包在编译的时候还是需要log4j的,但是在实际使用的时候log4j不是必须的,这样就成功去掉了依赖。

提供了基于BP(Back Propagation)神经网络结合PID(比例-积分-微分)控制策略的Simulink仿真模型。该模型旨在实现对杨艺所著论文《基于S函数的BP神经网络PID控制器及Simulink仿真》中的理论进行实践验证。在Matlab 2016b环境下开发,经过测试,确保能够正常运行,适合学习和研究神经网络在控制系统中的应用。 特点 集成BP神经网络:模型中集成了BP神经网络用于提升PID控制器的性能,使之能更好地适应复杂控制环境。 PID控制优化:利用神经网络的自学习能力,对传统的PID控制算法进行了智能调整,提高控制精度和稳定性。 S函数应用:展示了如何在Simulink中通过S函数嵌入MATLAB代码,实现BP神经网络的定制化逻辑。 兼容性说明:虽然开发于Matlab 2016b,但理论上兼容后续版本,可能会需要调整少量配置以适配不同版本的Matlab。 使用指南 环境要求:确保你的电脑上安装有Matlab 2016b或更高版本。 模型加载: 下载本仓库到本地。 在Matlab中打开.slx文件。 运行仿真: 调整模型参数前,请先熟悉各模块功能和输入输出设置。 运行整个模型,观察控制效果。 参数调整: 用户可以自由调节神经网络的层数、节点数以及PID控制器的参数,探索不同的控制性能。 学习和修改: 通过阅读模型中的注释和查阅相关文献,加深对BP神经网络与PID控制结合的理解。 如需修改S函数内的MATLAB代码,建议有一定的MATLAB编程基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值