AOP动态代理技术## 标题
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
与OOP不同,AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
代理
代理,顾名思义,让别人代自己做。生活中我们经常接触的类似的事就是网购,正常来说我们买东西都要到店里挑选付钱然后到手,现在我们可以通过网购,让卖家用快递代我们取商品送在自己手中。
AOP动态代理也一样,在别的类中代理实现
首先编写一个接口
public interface UserService {
void login();
void logout();
@Perfomance
void getUserList();
}
然后再编写实现类实现接口
public class UserServerimpl implements UserService {
@Override
public void login() {
System.out.println(1);
}
@Override
public void logout() {
System.out.println(2);
}
@Override
public void getUserList() {
System.out.println(3);
}
}
再写一个动态代理
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;
public class DyProxy {
//动态代理技术
private Object toProxyObj;
public Object getProxyObject(Object object){
this.toProxyObj = object; // 目标类的类加载器 // 目标类的接口列表
return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),
// 代理要执行的操作
new InvocationHandler() {
// 参数的含义:生成的代理对象、目标方法、方法参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result;
if (method.isAnnotationPresent(Perfomance.class)){
long startTime = new Date().getTime();
result = method.invoke(toProxyObj,args);
long endTime = new Date().getTime();
long totalTime = endTime - startTime;
System.out.println("函数执行了"+totalTime+"ms");
}else {
result = method.invoke(toProxyObj,args);
}
return result;
}
});
}
}
最后测试
public class TestAOP {
public static void main(String[] args) {
//AOP的面向对象切面编程,测试性能 统一日志 管理事务
UserService us = (UserService) new DyProxy().getProxyObject(new UserServerimpl());
us.getUserList();
us.login();
us.logout();
}
结果:
3
函数执行了1ms
1
2
AOP主要利用反射解决OOP的代码纠缠问题,同时他也用更抽象的概念去编写程序,他更注重一些程序发横切性行为,例如:
日志记录,跟踪,优化和监控
事务的处理
持久化
性能的优化
资源池,如数据库连接池的管理
系统统一的认证、权限管理等
应用系统的异常捕捉及处理
针对具体行业应用的横切行为
前面几种横切行为都已经得到了密切的关注,也出现了各种有价值的应用,但也许今后几年,AOP 对针对具体行业应用的贡献会成为令人关注的焦点。