`

spring入门 :一个输出日志的实例分析Java的代理机制

阅读更多
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 .运行测试:

这种方式,对于其他的类也同样适用,这样就真正地实现了业务逻辑和输出日志信息代码的分离。
分享到:
评论

相关推荐

    D:\Java\Framework\Spring\Code_Spring

    《Spring入门经典》源代码是学习Java Spring框架的理想资源,由Mert Caliskan和Kenan Sevindik两位作者撰写。Spring框架是Java开发中最常用的企业级应用框架,它以其模块化、轻量级和面向切面编程(AOP)的特点深受...

    spring的一个适合初学者的项目

    Spring 框架是Java开发中的一个核心框架,尤其对于初学者来说,它是一个极好的起点,可以帮助理解企业级应用的构建方式。本项目旨在为初学者提供一个基础的Spring项目实例,帮助大家快速上手并熟悉Spring的核心概念...

    Spring 基础和入门:Struts2+Spring整合

    Spring框架是Java开发中的一个核心组件,尤其在企业级应用中广泛使用。它提供了一个全面的编程和配置模型,用于简化Java应用程序的开发,特别是Web应用程序。Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP...

    Spring从入门到精通

    《Spring从入门到精通》是一本全面覆盖Spring框架核心概念和技术的教程,旨在帮助初学...提供的《Spring从入门到精通.pdf》文件应该包含详细的章节讲解和实例分析,帮助你在学习过程中步步为营,达到精通Spring的目标。

    spring入门实例

    Spring框架是Java开发中广泛应用的一个开源框架,以其依赖注入(Dependency Injection, DI)和面向切面编程(Aspect-Oriented Programming, AOP)的核心特性,极大地简化了企业级应用的开发工作。本实例旨在帮助初学...

    Spring Cloud 入门教程

    Spring Cloud 是一个基于Java的微服务开发框架,它为开发者提供了在分布式系统中配置服务注册与发现、断路器、智能路由、微代理、控制总线、全局锁、配置中心等众多功能。这个入门教程将带你逐步了解并掌握Spring ...

    spring入门笔记源码

    Spring 框架是 Java 企业级应用开发中的一个核心框架,它为应用程序提供了一个全面的基础设施,包括依赖注入(DI)、面向切面编程(AOP)、数据访问、Web 应用开发等多个方面。这份"Spring 入门笔记源码"旨在帮助...

    Spring基础讲义-java 入门必备

    Spring框架是Java开发中不可或缺的一部分,它以其强大的依赖注入(DI)和面向切面编程(AOP)功能闻名。Spring的基础知识是Java开发者入门必备,因为它极大地简化了应用程序的复杂性,提高了代码的可测试性和可维护...

    spring 入门学习资料

    #### 三、Spring入门案例分析 根据给定的部分内容,我们将逐步介绍如何使用Spring框架构建一个简单的应用程序: 1. **开发环境配置** - **Java环境**: 需要正确配置Java环境,推荐使用JDK1.4.2及以上版本。配置...

    Spring之MVC 入门实例

    在这个入门实例中,我们将深入理解 Spring MVC 的基本概念和工作原理,并通过实际操作来学习如何创建一个简单的应用程序。 1. **模型(Model)**:在 Spring MVC 中,模型对象负责存储应用程序的数据。它们可以是 ...

    spring入门小例子

    《Spring入门小例子详解》 Spring框架作为Java领域最广泛应用的轻量级框架之一,以其强大的依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)特性,深受开发者喜爱。本篇...

    Spring AOP入门及其实例讲解、下载

    Spring框架是Java开发中的一个流行选择,它提供了强大的AOP支持,使得我们可以轻松地实现横切关注点,如日志记录、事务管理等。本文将深入探讨Spring AOP的基本概念、核心术语以及如何通过实例来应用它。 ### 1. ...

    《spring framework 2 入门经典》一书的源代码

    《Spring Framework 2 入门经典》是一本深入浅出介绍Spring Framework 2.x版本的书籍,旨在帮助初学者快速掌握这一强大Java企业级应用框架的使用。源代码是学习和理解书中理论知识的重要辅助资源,它包含了书中各个...

    达内it培训 java培训电子书 内部资料 系列14 SPRING+MYBATIS开发实战 pdf

    10. 实战项目:通过一个完整的案例,展示Spring和MyBatis在实际项目中的应用流程,包括需求分析、设计、编码和测试。 这份内部资料对于希望提升Spring和MyBatis使用技巧的Java开发者来说是一份宝贵的资源,它不仅...

    SpringCloud入门案例 nacos dubbo

    在IT行业中,Spring Cloud是一个广泛使用的微服务框架,它提供了许多工具和服务,帮助开发者构建分布式系统。本案例主要关注Spring Cloud与Nacos和Dubbo的整合,这些都是微服务架构中的重要组件。 首先,Spring ...

    Spring入门教程.doc

    ### Spring入门教程知识点详解 #### 一、Spring基础概念 **1. 依赖注入 (Dependency Injection, DI)** 依赖注入是一种设计模式,在Spring框架中得到了广泛的应用。它指的是在程序运行过程中,由容器来创建对象,并...

    学习Spring(一)入门

    在本篇【学习Spring(一)入门】的学习中,我们将探讨Spring框架的基础知识,这是一个广泛应用于Java企业级应用的开源框架。Spring以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented ...

    Spring_MVC_教程_快速入门_深入分析

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过分离控制器、模型对象、分派器以及处理器视图等,将Web层进行职责解耦,定义了应用程序中每个组件的软件边界,使得它们更容易进行...

    JAVA上百实例源码以及开源项目源代码

    数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写的...

    SpringCloud入门demo资料.zip

    SpringCloud是中国Java开发者广泛使用的微服务框架...总之,SpringCloud入门demo资料旨在为初学者提供一个实践平台,通过实际操作来掌握SpringCloud的核心组件和工作原理,从而更好地理解和运用到实际的微服务项目中。

Global site tag (gtag.js) - Google Analytics