AOP学习心得&jdk动态代理与cglib比较
2016-09-08 00:30
477 查看
什么是AOP
AOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。AOP使用场景
AOP用来封装横切关注点,具体可以在下面的场景中使用:Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Persistence 持久化。。。等
jdk动态代理与cglib比较
jdk的动态代理是基于类实现了接口,cglib是基于类,没有强制要求目标类一定要是实现接口。jdk的核心是实现InvocationHandler接口,使用invoke()方法进行面向切面的处理,调用相应的通知。
cglib的核心是实现MethodInterceptor接口,使用intercept()方法进行面向切面的处理,调用相应的通知。
其中cglib中有一个Enhancer类,可以使用他快速的创建一个代理类。
例如:
@Test public void testEnhancer() { Enhancer enhancer = new Enhancer(); enhancer.setSuperclass(Print.class);//代理目标类 //回调函数--执行目标类的方法 enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable { System.out.println("intercept begin..."); return proxy.invokeSuper(obj,args); } }); Print print = (Print) enhancer.create(); print.doPrint("打印机"); } 通过设置目标类和回调函数后调create()方法就可以创建一个代理类处理,简单粗暴。。嘿嘿。。
aop简单的学习demo
配置spring文件中加入:<bean id="aopAdvisor" class="com.springapp.utils.AopAdvisor"/> <aop:config expose-proxy="false" proxy-target-class="false"> <!-- 定义切面 --> <aop:aspect ref="aopAdvisor"> <!-- 定义切入点 --> <aop:pointcut id="teacherService" expression="execution(* com.springapp.service.*.*(..))" /> <!-- 定义前置 --> <aop:before method="before" pointcut-ref="teacherService"/> <!-- 引入 --> <aop:declare-parents types-matching="com.springapp..*.TeacherService+" implement-interface="com.springapp.service.AopParentService" default-impl="com.springapp.service.impl.AopParentServiceImpl"/> <!-- 定义后置 --> <aop:after method="after" pointcut-ref="teacherService"/> <!-- 环绕通知 --> <aop:around method="doAround" pointcut-ref="teacherService"/> </aop:aspect> </aop:config>
@Slf4j public class AopAdvisor { public void before(JoinPoint point) { System.out.println("AopAdvisor类的before(),目标方法是:"+point); } public void after(JoinPoint point) { System.out.println("AopAdvisor类after(),目标方法是:"+point); } public Object doAround(ProceedingJoinPoint point) throws Throwable { System.out.println("AopAdvisor类的doAround(),目标方法是:"+point); return point.proceed(); } }
相关文章推荐
- spring框架学习(八)—静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- AOP的底层实现-CGLIB动态代理和JDK动态代理 (以后学习)
- Spring学习总结——静态代理、JDK与CGLIB动态代理、AOP+IoC
- JDK动态 代理 & CgLib 学习总结
- spring aop学习8:spring对jdk和cglib动态代理的选择
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- spring对AOP的支持 JDK动态代理和CGLIB的区别
- AOP实现--JDK中的动态代理和cglib代理
- 好记性不如烂笔头48-java拦截器-JDK自带动态代理和CGLIB效率比较(3)
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- spring 学习基础笔记 包括spring 的代理 JDK CGLIB 事物 AOP 以及各种注入
- 动态代理-JDK_proxy&cglib
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- Java学习之java动态代理(JDK和cglib)
- Spring AOP 代理机制 JDK&CGLIB
- 通过CGLIB实现AOP的浅析(顺便简单对比了一下JDK的动态代理)
- AOP编程之JDK动态代理和Cglib动态代理