本文代码托管在github:https://github.com/Wuchenwcf/SpringAOPFileManager
本文结合我前面所学的基础知识,写一个综合了Spring的依赖注入和面向切面编程的Demo
此Demo完成如下功能:
(1) 建立类FileManager,对文件进行增加、删除、压缩等操作,可打开某个文件进行查看(也可与RMI实验的文件操作相结合)。
(2)建立切面类Audit:
(3)把用户所有的操作都记录到文件log.txt;
(4) 对于删除文件操作,在操作前给出“确认要删除吗”提醒,在删除文件后给出“删除成功”的提示。
(5) 对于查看文件操作,如果文件内容包含“JAVA” 或者“Middleware”,给出提醒信息。
1.编写文件操作接口FileManager
package com.midware.wcf.Bean;
public interface FileManager
{
public void create(String name);
public void delete(String name);
public void show();
public void look(String name);
public void makezip(String name);
}
2.编写文件操作的实现类
package com.midware.wcf.Imp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.midware.wcf.Bean.FileManager;
public class FileManagerImp implements FileManager{
File directory=new File(System.getProperty("user.dir"));//获取当前路径
public void create(String name) {
// TODO Auto-generated method stub
File f=new File(name);
if(f.exists())
{
System.out.println("文件已经存在!");
}
else
{
try {
f.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("文件创建成功");;
}
}
public void delete(String name) {
// TODO Auto-generated method stub
File f=new File(name);
if(!f.exists())
{
System.out.println("文件不存在!");
}
else
{
f.delete();
}
}
//展示当前目录的所有文件
public void show() {
// TODO Auto-generated method stub
System.out.println("当前目录下的文件有:");
File fa[]=directory.listFiles();
for(int i=0;i<fa.length;i++)
if(fa[i].isDirectory())
{
System.out.println(fa[i].getName()+"[目录]");
}
else
{
System.out.println(fa[i].getName());
}
}
public void look(String name) {
// TODO Auto-generated method stub
File f=new File(name);
if(!f.exists())
{
System.out.println("文件不存在");
}
else
{
try {
InputStreamReader read=new InputStreamReader(new FileInputStream(f),"GBK");
BufferedReader buffer=new BufferedReader(read);
String s=null;
try {
while((s=buffer.readLine())!=null)
System.out.println(s);
read.close();
System.out.println();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void makezip(String name) {
// TODO Auto-generated method stub
try {
File file = new File(name);
File zipFile = new File(name+".zip");
InputStream input = new FileInputStream(file);
ZipOutputStream zipOut = new ZipOutputStream(new FileOutputStream(zipFile));
zipOut.putNextEntry(new ZipEntry(file.getName()));
int temp = 0;
while((temp = input.read()) != -1){
zipOut.write(temp);
}
input.close();
zipOut.close();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("压缩成功");
}
}
3.编写日志接口类
package com.midware.wcf.Bean;
public interface LogManager {
public void createLog(String name);
public void delectlog(String name);
public void makeziplog(String name);
public void looklog(String name);
}
4.编写日志实现类
package com.midware.wcf.Imp;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.midware.wcf.Bean.*;
public class LogManagerImp implements LogManager {
File log=new File("Log.txt");
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
public LogManagerImp()
{
if(!this.log.exists())
{
try {
this.log.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void createLog(String name) {
// TODO Auto-generated method stub
try {
FileWriter fw=new FileWriter(this.log,true);
fw.write(df.format(new Date())+" 用户创建了文件"+name+"\r\n");
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void delectlog(String name) {
// TODO Auto-generated method stub
try {
FileWriter fw=new FileWriter(this.log,true);
fw.write(df.format(new Date())+" 用户删除了文件"+name+"\r\n");
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void makeziplog(String name) {
// TODO Auto-generated method stub
try {
FileWriter fw=new FileWriter(this.log,true);
fw.write(df.format(new Date())+" 用户压缩了文件"+name+"\r\n");
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void looklog(String name) {
// TODO Auto-generated method stub
try {
FileWriter fw=new FileWriter(this.log,true);
fw.write(df.format(new Date())+" 用户查看了文件"+name+"\r\n");;
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
5.编写切面类
package com.midware.wcf.Audience;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Scanner;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.midware.wcf.Bean.LogManager;
import com.midware.wcf.Imp.LogManagerImp;
@Component
@Aspect
public class Audience {
private LogManager logimp;
@Autowired
public Audience(LogManager lm)
{
this.logimp=lm;
}
public void setLogManager(LogManager lm)
{
this.logimp=lm;
}
@AfterReturning("execution(* com.midware.wcf.Bean.FileManager.create(String)) "+"&& args(name)")
public void createLog(String name)
{
logimp.createLog(name);
}
@AfterReturning("execution(* com.midware.wcf.Bean.FileManager.delete(String)) "+"&& args(name)")
public void deleteLog(String name)
{
this.logimp.delectlog(name);
}
@AfterReturning("execution(* com.midware.wcf.Bean.FileManager.makezip(String)) "+"&& args(name)")
public void makezipLog(String name)
{
this.logimp.makeziplog(name);
}
@Pointcut("execution(** com.midware.wcf.Bean.FileManager.delete(..)) ")
public void dodelete()
{ }
@Around("dodelete()")
public void comfirm(ProceedingJoinPoint jp)
{
System.out.println("确认要删除吗?yes/no");
Scanner sc=new Scanner(System.in);
String s=sc.next();
if(s.equals("yes"))
try {
jp.proceed();
System.out.println("文件删除成功!");
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@AfterReturning("execution(* com.midware.wcf.Bean.FileManager.look(String)) "+"&& args(name)")
public void search(String name)
{
this.logimp.looklog(name);
File f=new File(name);
InputStreamReader read;
try {
read = new InputStreamReader(new FileInputStream(f),"GBK");
BufferedReader buffer=new BufferedReader(read);
String s=null;
while((s=buffer.readLine())!=null)
{
String[] sn=s.split(" ");
for(int i=0;i<sn.length;i++)
{
if(sn[i].endsWith("MiddleWare"))
System.out.println("文件中含有Middleware");
else
if(sn[i].equals("JAVA"))
System.out.println("文件中含有JAVA");
}}
read.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println();
}
}
6.Config类
package com.midware.wcf.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import com.midware.wcf.Audience.Audience;
import com.midware.wcf.Bean.FileManager;
import com.midware.wcf.Bean.LogManager;
import com.midware.wcf.Imp.FileManagerImp;
import com.midware.wcf.Imp.LogManagerImp;
@Configuration
@EnableAspectJAutoProxy
@ComponentScan
public class JavaConfig {
@Bean
public LogManager logm()
{
return new LogManagerImp();
}
@Bean
public FileManager fileManager()
{
return new FileManagerImp();
}
@Bean
public Audience audience()
{
return new Audience(logm());
}
}
7.Main程序
package com.midware.wcf.Main;
import java.util.Scanner;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.midware.wcf.Bean.FileManager;
import com.midware.wcf.Config.JavaConfig;
public class FileManageMain {
FileManager fm;
Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
// TODO Auto-generated method stub
ApplicationContext context=new AnnotationConfigApplicationContext(JavaConfig.class);
FileManageMain main=new FileManageMain(context.getBean(FileManager.class));
main.run();
}
FileManageMain(FileManager fm)
{
this.fm=fm;
}
void run()
{
fm.show();
System.out.println("请选择您要执行的操作:1.新建 2.删除 3.压缩 4.查看 0.退出");
int n=sc.nextInt();
switch(n)
{
case 1:create();break;
case 2:delete();break;
case 3:makezip();break;
case 4:look();break;
default:break;
}
}
void create()
{
System.out.println("请输入您要创建的文件名:");;
String name=sc.next();
fm.create(name);
this.run();
}
void delete()
{
System.out.println("请输入您要删除的文件名");
String name=sc.next();
fm.delete(name);
this.run();
}
void makezip()
{
System.out.println("请输入您要压缩的文件名");
String name=sc.next();
fm.makezip(name);
this.run();
}
void look()
{
System.out.println("请输入您要查看的文件名");
String name=sc.next();
fm.look(name);
this.run();
}
}