spring aop工作原理,springmvc aop原理
如何解决写爬虫IP受阻的问题?立即使用。
spring aop原理:
AOP(面向方面)是一种编程范式,它提供了另一种考虑程序结构的方式来改进面向对象编程(OOP)。
AOP为开发者提供了一种描述横切关注点的机制,可以自动将横切关注点编织到面向对象的软件系统中,从而实现横切关注点的模块化。
AOP可以封装与业务无关,但通常被业务模块调用的逻辑或职责,如事务处理、日志管理、权限控制等。便于减少系统的重复代码,降低模块间的耦合度,有利于以后的可操作性和可维护性。
使用AOP的好处
降低模块的耦合度。
使系统易于扩展。
提高代码可重用性
AOP的基本概念
连接点:横切关注点需要插入到程序中的点。连接点可能在类初始化、方法调用、字段调用或异常处理等中。Spring只支持方法执行连接点。
切入点:一组相关的连接点。
建议:在连接点执行的行为。增强提供了一种方法来扩展AOP中切入点所选择的连接点处的现有行为。包括建议前、建议后和建议前后。
方面:通知和切入点的结合。
编织:编织是一个过程,是将切面应用于目标对象来创建AOP代理对象的过程。
代理:通过代理将切面应用于目标对象。AOP代理可以通过JDK动态代理或CGLIB代理来实现。
目标:需要织入焦点的对象。也就是被表示的对象。
实现AOP的主要设计模式是动态代理。
Spring的动态代理有两种:一是JDK的动态代理;另一个是cglib动态代理。
JDK动态智能体模拟
JDK动态代理的两个核心接口(类)分别是InvocationHandler和Proxy。注意:您只能代理接口。
公共类TimeHandler实现InvocationHandler {
//目标对象
私有对象targetObject
public time handler(Object target Object){
this . target object=target object;
}
@覆盖
//调用时将执行此实现类的关联方法。
/*调用handler接口的方法,proxy表示代理,method表示调用原始对象的方法,
Args表示方法的参数*/
公共对象调用(对象代理、方法方法、对象[]参数)
可投掷的
Object ret=null
尝试{
System.out.println(在 method: system . current time millis())之前);
//调用目标方法
ret=method.invoke(targetObject,args);
System.out.println(在 method: system . current time millis())之后);
}catch(异常e){
e . printstacktrace();
system . out . println( error );
扔e;
}
返回ret
}
}TimeHandler类实现InvocationHandler接口。实现核心方法invoke,它有3个参数。第一个参数生成的代理类实例,第二个参数目标对象的方法,第三个参数方法的参数值数组。
公共类ProxyUtil {
@SuppressWarnings(未选中)
public static T T proxy one(Class loader loader,Class?[] clz,InvocationHandler处理程序){
return(T)proxy . newproxyinstance(loader,clz,handler);
}
}ProxyUtil类只是封装了Proxy.newProxyInstance()方法。这个方法也有3个参数。第一个参数生成代理对象的类加载器,第二个参数是目标对象的接口数组,第三个参数是实现InvocationHandler接口的类实例。
公共接口UserManager {
public void addUser(字符串userId,字符串用户名);
}
公共类UserManagerImpl实现UserManager {
@覆盖
public void addUser(字符串userId,字符串userName) {
system . out . println( addUser(id: userId ,name: userName ));
}
}
公共静态void main(String[] args) {
用户管理器um=new UserManagerImpl();
日志处理程序日志=新的log handler(um);
um=代理实用程序。代理一(嗯。getclass().getClassLoader(),
um.getClass().getInterfaces()、log);
时间处理程序time=新时间处理程序(um);
um=代理实用程序。代理一(嗯。getclass().getClassLoader(),
um.getClass().getInterfaces()、time);
um.addUser(1111 ,张三);
}为了演示需要,这边又增加了一个LogHandler,跟时间处理器代码一样。
字节码生成动态代理模拟
字节码生成动态代理的两个核心接口(类)分别是环绕通知和增强剂。是不是跟爪哇岛开发工具包动态代理很相似,用法也差不多。但字节码生成可以代理类和接口。注意:不能代理最后的类。
公共类时间拦截器实现MethodInterceptor {
私有对象目标;
公共时间拦截器(对象目标){
目标=目标
}
@覆盖
公共对象拦截(对象代理,方法方法,
Object[]参数,MethodProxy调用)抛出可投掷的
System.out.println(方法之前:系统。当前时间毫秒());
对象ret=调用。invoke(target,args);
System.out.println(方法之后:系统。当前时间毫秒());
返回浸水使柔软
}
}拦截方法四个参数。1.生成的代理类实例。2.被代理对象的方法引用。3.方法参数值数组。4.代理类对方法的代理引用。
公共类ProxyUtil
@SuppressWarnings(未选中)
公共静态测试代理人(类clz,MethodInterceptor拦截器){
return (T)Enhancer.create(clz,interceptor);
}
}增强剂类是字节码生成中的字节码增强器。
公共类用户管理{
公共void addUser(字符串用户Id,字符串用户名){
系统。出去。println( addUser(id: userId ,name: userName ));
}
}
公共静态void main(String[] args) {
用户管理um=新用户管理();
时间拦截器时间=新时间拦截器(um);
um=代理实用程序。代理一(嗯。获取类(),时间);
um.addUser(111 ,老王);
}以上就是面向方面编程原理是什么的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。