最近一直在边改bug边研究Spring 作为一个新手程序猿 Spring在我面前简直就是博大精深 其中的IOC和AOP就是Spring的精髓 ,其中的AOP便是面向对象设计思想的补充
AOP Aspect Oriented Programming 面向切面编程 在我看来 aop便是那个为了软件开发过程中高内聚低耦合
AOP在实际的工作环境中一般用在事务控制 其主要实现原理是利用代理技术实现的
1 动态代理
jdk1.5中提供,利用反射。实现InvocationHandler接口
/**
* 动态代理类
*
* @author liangweiming
*
*/
public class DynamicProxy implements InvocationHandler {
/** 需要代理的目标类 */
private Object target;
/**
* 写法固定,aop专用:绑定委托对象并返回一个代理类
*
* @param delegate
* @return
*/
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
/**
* @param Object
* target:指被代理的对象。
* @param Method
* method:要调用的方法
* @param Object
* [] args:方法调用时所需要的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
// 切面之前执行
System.out.println("切面之前执行");
// 执行业务
result = method.invoke(target, args);
// 切面之后执行
System.out.println("切面之后执行");
return result;
}
}
/**
* 测试类
*
* @author liangweiming
*
*/
public class Test {
public static void main(String[] args) {
// 绑定代理,这种方式会在所有的方法都加上切面方法
ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());
iTalk.talk("业务说明");
}
}
输出结果
切面之前执行
people talk业务说法
切面之后执行
从上面的代码可以看出 可以在需要的业务代码之前动态的加入切面方法 不过此种方法需要代理类实现接口 有其局限性