1.通用的日志输出方法
a. 原来在程序中编写日志时,都要在每一个业务逻辑方法里编写记录日志的代码:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class TimeBook {
private Logger logger = Logger.getLogger(this.getClass().getName()); //审核数据的相关程序
public void doAuditing(String name) {
logger.log(Level.INFO, name + " 开始审核数据....");
//审核数据的相关程序
……
logger.log(Level.INFO, name + " 审核数据结束....");
}
}
b. 编写测试程序:
import com.gc.action.TimeBook;
public class TestHelloWorld {
public static void main(String[] args) {
TimeBook timeBook = new TimeBook();
timeBook.doAuditing("张三");
}
}
c.运行测试程序
在上面的示例中,是把日志信息添加在了具体的业务逻辑中,假如程序中其他的代码都需要日志输出的功能,那么每个程序就都要添加和上面类似的代码。这样,在程序中,就会存在很多类似的日志输出代码,造成了很大的耦合,通过什么方法可以使业务逻辑和输出日志的代码分离呢?通过面向接口编程可以改进这个问题。
2.通过面向接口编程实现日志输出
实现思路是:首先把执行考勤审核的doAuditing()方法提取出来成为接口,然后通过一个实体类来实现这个方法,在这个方法里编写具体的考勤审核的业务逻辑,接着通过一个代理类来进行日志输出,最后编写测试程序,查看输出结果。具体步骤如下:
a .接口TimeBookInterface:
import org.apache.log4j.Level;
//通过面向接口编程实现日志输出
public interface TimeBookInterface {
public void doAuditing(String name);
}
b .实现接口TimeBookInterface:
public class TimeBook implements TimeBookInterface {
public void doAuditing(String name) {
//审核数据的相关程序
……
}
}
c. 编写一个代理类:
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class TimeBookProxy {
private Logger logger = Logger.getLogger(this.getClass().getName());
private TimeBookInterface timeBookInterface;
//在该类中针对前面的接口TimeBookInterface编程,而不针对具体的类
public TimeBookProxy(TimeBookInterface timeBookInterface) {
this.timeBookInterface = timeBookInterface;
}
//实际业务处理
public void doAuditing(String name) {
logger.log(Level.INFO, name + " 开始审核数据....");
timeBookInterface.doAuditing(name);
logger.log(Level.INFO, name + " 审核数据结束....");
}
}
d .编写测试:
public class TestHelloWorld {
public static void main(String[ ] args) {
//这里针对接口进行编程
TimeBookProxy timeBookProxy = new TimeBookProxy(new TimeBook());
timeBookProxy .doAuditing("张三");
}
}
e.运行测试:
和前面一个日志输出做对比,可以看到,在这个示例中,具体负责考勤审核的业务逻辑代码和日志信息的代码分离开了,并且以后只要实现了接口 TimeBookInterface的类,都可以通过代理类TimeBookProxy实现日志信息的输出,而不用再每个类里面都写日志信息输出的代码,从而实现了日志信息的代码重用
3.使用Java的代理机制进行日志输出
Java提供的InvocationHandler接口可以实现这种功能,首先编写一个日志信息的代理类,这个代理类实现了接口 InvocationHandler,然后和前面一个实例类似,编写一个接口,并实现这个接口,在实现类中编写具体的考勤审核代码,最后针对接口编写测试类,查看测试结果。具体步骤如下:
a .编写一个日志信息的代理类:
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
//代理类实现了接口InvocationHandler
public class LogProxy implements InvocationHandler {
private Logger logger = Logger.getLogger(this.getClass().getName());
private Object delegate;
//绑定代理对象
public Object bind(Object delegate) {
this.delegate = delegate;
return Proxy.newProxyInstance(delegate.getClass().getClassLoader(), delegate.getClass().
getInterfaces(), this);
}
//针对接口编程
public Object invoke(Object proxy, Method method, Object[ ] args) throws Throwable {
Object result = null;
try {
//在方法调用前后进行日志输出
logger.log(Level.INFO, args[0] + " 开始审核数据....");
result = method.invoke(delegate, args);
logger.log(Level.INFO, args[0] + " 审核数据结束....");
} catch (Exception e){
logger.log(Level.INFO, e.toString());
}
return result;
}
}
b .接口TimeBookInterface:
import org.apache.log4j.Level;
//针对接口编程
public interface TimeBookInterface {
public void doAuditing(String name);
}
c .实现接口:
import com.gc.impl.TimeBookInterface;
public class TimeBook implements TimeBookInterface {
public void doAuditing(String name) {
//审核数据的相关程序
……
}
}
d .测试代码:
public class TestHelloWorld {
public static void main(String[ ] args) {
//实现了对日志类的重用
LogProxy logProxy = new LogProxy();
TimeBookInterface timeBookProxy = (TimeBookInterface)logProxy.bind(new TimeBook());
timeBookProxy.doAuditing("张三");
}
}
e .运行测试:
这种方式,对于其他的类也同样适用,这样就真正地实现了业务逻辑和输出日志信息代码的分离。
分享到:
相关推荐
《Spring入门经典》源代码是学习Java Spring框架的理想资源,由Mert Caliskan和Kenan Sevindik两位作者撰写。Spring框架是Java开发中最常用的企业级应用框架,它以其模块化、轻量级和面向切面编程(AOP)的特点深受...
Spring 框架是Java开发中的一个核心框架,尤其对于初学者来说,它是一个极好的起点,可以帮助理解企业级应用的构建方式。本项目旨在为初学者提供一个基础的Spring项目实例,帮助大家快速上手并熟悉Spring的核心概念...
Spring框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。它提供了一个全面的编程和配置模型,用于简化Java应用程序的开发,特别是Web应用程序。Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP...
《Spring从入门到精通》是一本全面覆盖Spring框架核心概念和技术的教程,旨在帮助初学...提供的《Spring从入门到精通.pdf》文件应该包含详细的章节讲解和实例分析,帮助你在学习过程中步步为营,达到精通Spring的目标。
Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,极大地简化了企业级应用的开发工作。本实例旨在帮助初学...
Spring Cloud 是一个基于Java的微服务开发框架,它为开发者提供了在分布式系统中配置服务注册与发现、断路器、智能路由、微代理、控制总线、全局锁、配置中心等众多功能。这个入门教程将带你逐步了解并掌握Spring ...
Spring 框架是 Java 企业级应用开发中的一个核心框架,它为应用程序提供了一个全面的基础设施,包括依赖注入(DI)、面向切面编程(AOP)、数据访问、Web 应用开发等多个方面。这份"Spring 入门笔记源码"旨在帮助...
Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。Spring的基础知识是Java开发者入门必备,因为它极大地简化了应用程序的复杂性,提高了代码的可测试性和可维护...
#### 三、Spring入门案例分析 根据给定的部分内容,我们将逐步介绍如何使用Spring框架构建一个简单的应用程序: 1. **开发环境配置** - **Java环境**: 需要正确配置Java环境,推荐使用JDK1.4.2及以上版本。配置...
在这个入门实例中,我们将深入理解 Spring MVC 的基本概念和工作原理,并通过实际操作来学习如何创建一个简单的应用程序。 1. **模型(Model)**:在 Spring MVC 中,模型对象负责存储应用程序的数据。它们可以是 ...
《Spring入门小例子详解》 Spring框架作为Java领域最广泛应用的轻量级框架之一,以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)特性,深受开发者喜爱。本篇...
Spring框架是Java开发中的一个流行选择,它提供了强大的AOP支持,使得我们可以轻松地实现横切关注点,如日志记录、事务管理等。本文将深入探讨Spring AOP的基本概念、核心术语以及如何通过实例来应用它。 ### 1. ...
《Spring Framework 2 入门经典》是一本深入浅出介绍Spring Framework 2.x版本的书籍,旨在帮助初学者快速掌握这一强大Java企业级应用框架的使用。源代码是学习和理解书中理论知识的重要辅助资源,它包含了书中各个...
10. 实战项目:通过一个完整的案例,展示Spring和MyBatis在实际项目中的应用流程,包括需求分析、设计、编码和测试。 这份内部资料对于希望提升Spring和MyBatis使用技巧的Java开发者来说是一份宝贵的资源,它不仅...
在IT行业中,Spring Cloud是一个广泛使用的微服务框架,它提供了许多工具和服务,帮助开发者构建分布式系统。本案例主要关注Spring Cloud与Nacos和Dubbo的整合,这些都是微服务架构中的重要组件。 首先,Spring ...
### Spring入门教程知识点详解 #### 一、Spring基础概念 **1. 依赖注入 (Dependency Injection, DI)** 依赖注入是一种设计模式,在Spring框架中得到了广泛的应用。它指的是在程序运行过程中,由容器来创建对象,并...
在本篇【学习Spring(一)入门】的学习中,我们将探讨Spring框架的基础知识,这是一个广泛应用于Java企业级应用的开源框架。Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented ...
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过分离控制器、模型对象、分派器以及处理器视图等,将Web层进行职责解耦,定义了应用程序中每个组件的软件边界,使得它们更容易进行...
数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...
SpringCloud是中国Java开发者广泛使用的微服务框架...总之,SpringCloud入门demo资料旨在为初学者提供一个实践平台,通过实际操作来掌握SpringCloud的核心组件和工作原理,从而更好地理解和运用到实际的微服务项目中。