我最近在写一个简易的java web框架,其中包括ioc,mvc,aop,dao等基本功能,这几天把aop这块弄得差不多了,所以在这里总结一下。
项目详细信息:coin-framework
spring中核心的概念就是ioc和aop。aop面向切面编程听起来很厉害,所以今天我们用cglib动态代理来实现一个简单的aop。
首先我们模仿一下spring的aop中基于注解的切面编程。
@Aspect 标识切面类
package com.me.coin.framework.aop.annotation;
import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 标识切面类
* @author dwl
*
*/
@Documented
@Retention(RUNTIME)
@Target(TYPE)
public @interface Aspect {
//切入点
String pointCut();
//过滤
String filter() default "";
}
@Before 前置通知
package com.me.coin.framework.aop.annotation;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 前置通知
*
* @author dwl
*
*/
@Documented
@Retention(RUNTIME)
@Target(METHOD)
public @interface Before {
}
@After 后置通知
package com.me.coin.framework.aop.annotation;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 后置通知
*
* @author dwl
*
*/
@Documented
@Retention(RUNTIME)
@Target(METHOD)
public @interface After {
}
@Throwing 异常通知
package com.me.coin.framework.aop.annotation;
import static java.lang.annotation.ElementType.METHOD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
/**
* 异常通知
*
* @author dwl
*
*/
@Documented
@Retention(RUNTIME)
@Target(METHOD)
public @interface Throwing {
}
切面方法封装
package com.me.coin.framework.aop;
import java.lang.reflect.Method;
import com.me.coin.framework.aop.annotation.After;
import com.me.coin.framework.aop.annotation.Before;
import com.me.coin.framework.aop.annotation.Throwing;
import net.sf.cglib.proxy.MethodProxy;
/**
* aop代理
*
* @author dwl
*
*/
public class AopProxy {
//切面类
private Object