使用spring-aop计算文件复制的耗时

使用spring-aop计算文件复制的耗时

Example:计算复制文件的耗时

设计

spring 的环绕通知(advice)可以在某一任务开始前和结束后执行一些增强方法。所以可以使用这一特性来计算任务的耗时。

程序结构:

CountTime.java    -- 通知类(advice)
CopyFile.java     -- 连接点(jointPoint)
spring-beans.xml  -- spring 配置文件
AOPTest.java      -- 测试类

文件解析

  1. CopyFile.java
    使用BufferedInputStream 和 BufferedOutputStream 完成文件复制的任务。(此例中文件路径已经写死,可酌情更改)

  2. CountTime.java
    创建一个方法,分别记录开始复制前和复制完成之后的时间的ms 值。两者相减。

  3. spring-beans.xml 已导入aop的约束
    配置内容:

    1. bean 的配置
    2. aop 配置

    配置详情:





    
    
        
    

配置解析:

  1. bean 的配置是为了使用spring 容器获取类的实例。

  2. 切入点的定义: 要拦截的方法(本例中需要拦截的方法是文件复制的方法)

  3. 切面: 切面 = 切入点 + 通知

  4. 此例中使用的是环绕通知 aop:around

  5. AOPTest.java
    使用Junit 框架对文件复制耗时进行测试。

    @Test
    public void testCopy(){
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-beans.xml");
        // 从spring 容器中获取 CopyFile 的实例
        CopyFile cf = (CopyFile) applicationContext.getBean("copyFile");
        //执行文件复制的方法
        cf.copyFile(); 
    }

源代码参考:
1.CopyFile.java

package pub.kejin; 

import java.io.*; 
/**
 * 使用spring aop 测试文件复制使用的时间
 * 、使用spring环绕通知 -- around
 */ 
public class CopyFile {

    //pointcut
    public void copyFile(){
        try{
            BufferedInputStream inputStream = new BufferedInputStream(new FileInputStream(new File("D:\\fastsharebook.zip")));
            BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream("D:\\aopTest.zip"));

            int len = 0;
            byte[] b = new byte[1024];
            while((len=inputStream.read(b)) != -1) {
                outputStream.write(b);
            } 
            outputStream.close();
            inputStream.close();

        }catch (IOException io){
            io.printStackTrace();
            System.out.println("io exception");
        } 
    }

}

  1. CountTime.java
package pub.kejin.utils; 

import org.aspectj.lang.ProceedingJoinPoint; 
import java.util.Calendar; 

//aspect
public class CountTime { 
    //around
    public void countTime(ProceedingJoinPoint jp){

        try{
            System.out.println("begin copy"); 
            long beforeCopy = Calendar.getInstance().getTimeInMillis();
             
            jp.proceed();

            long afterCopy = Calendar.getInstance().getTimeInMillis(); 
            System.out.println("copy done"); 
            System.out.println("Copying File takes :" + (afterCopy-beforeCopy) + " ms");

        }catch (Throwable t){
            System.out.println("Copy file encounter a misstake!");
        }  
    }
}

  1. spring-beans.xml



    
    

    
        
        
            
        
    


  1. AOPTest.java
package pub.kejin;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AOPTest {
    @Test
    public void testCopy(){
        ApplicationContext applicationContext =
                new ClassPathXmlApplicationContext("spring-beans.xml");

        CopyFile cf = (CopyFile) applicationContext.getBean("copyFile");
        cf.copyFile();
    }
}

你可能感兴趣的:(java,spring-aop)