SpringAOP动态代理小结
来源:互联网 发布:网络远程教育在哪报名 编辑:程序博客网 时间:2024/05/22 00:31
学习springAOP时,顺便学习了jdk与cglb动态代理,jdk与cglb动态代理最大不同之处就是jdk动态代理是基于接口的,如果有的项目不是基于接口又想实现动态代理,就需要cglb动态代理,这里总结下AOP的动态代理。
springAOP动态代理实现方式
是基于jdk与cglb的,就是选它们一种来实现。这里涉及两个属性
proxyTargetClass属性,若为true,则是面向类动态代理,这时是基于CGLB,需要CGLB包cglib-nodep-2.1_3.jar或者设置optimize为true。就是基于CGLB包的,springAOP默认是基于JDK动态代理,就是需要接口
springAOP的五种增强
要实现增强需写一个类实现这几个方法
前置增强:org.springframework.aop.BeforeAdvice 后置增强:org.springframework.aop.AfterAdvice 环绕增强:org.springframework.aop.MethodInterceptor异常抛出增强: org.springframework.aop.ThrowsAdvice引介增强:org.springframework.aop.IntroductionInterceptor 重点总结下引介增强:针对类(对象),改变对象中的某个属性或方法的时候执行通知类型具体继承类:DelegatingIntroductionInterceptor(已实现上面的接口)
写一个例子来分析引介增强
//这里我用的基于cglib代理的,所以不定义接口//定义一个目标类,保存什么东西。我想在保存的时候在前面做一些事,或者后面做一些事,并且可以控制我是否可以做这些事,不想做就取消,想做就添加,这是环绕通知做不到的。public class Waiter { public void save(String name){ System.out.println("保存=============" + name); }}//写个接口,控制我是否启动来做这些事比如数据库事物的开启与关闭public interface IControllerOpen { //控制通知的打开和关闭 public void setOpen(boolean flag);}//织入类,继承DelegatingIntroductionInterceptor这个类并实现我们的控制接口public class ControllerInterceptor extends DelegatingIntroductionInterceptor implements IControllerOpen{ ThreadLocal<Boolean> threadLocal = new ThreadLocal<Boolean>(); //名字必须一样,因为这是最初接口的名字,我们只是再继承了一个类 @Override public Object invoke(MethodInvocation mi) throws Throwable{ Object obj = null; if(threadLocal.get() != null && threadLocal.get()){ System.out.println("事物开启。。。"); obj = super.invoke(mi); System.out.println("事物提交。。。。"); }else{ obj = super.invoke(mi); } return obj; } @Override public void setOpen(boolean flag) { threadLocal.set(flag); }}//欧了,写个测试public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("classpath:com/tree/aop3/bean.xml"); Waiter waiter = (Waiter) context.getBean("proxy"); IControllerOpen contro = (IControllerOpen) waiter; //设置为false,表示我不想增强了,如果设置或true则表示增强,方便控制了 contro.setOpen(false); waiter.save("黑猫"); System.out.println("============"); }}//当然还有ioc的配置 <!-- 目标类(对象) --> <bean id="target" class="com.tree.aop3.Waiter"></bean> <!-- 织入类 --> <bean id="advice" class="com.tree.aop3.ControllerInterceptor"></bean> <!-- 代理工厂 --> <bean id="proxy" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="target"></property> <property name="interfaces" value="com.tree.aop3.IControllerOpen"></property> <property name="interceptorNames" value="advice"></property> <property name="proxyTargetClass" value="true"></property> </bean>
其余的增强都大同小异,不过异常增强通知是需要手动抛出一个异常的。欧了,小长我继续学习去了。
0 0
- SpringAOP动态代理小结
- Jdk动态代理和springAOP
- SpringAOP CGLIB动态代理 理解
- SpringAOP JDK 动态代理 理解
- springAOP实现之动态代理
- 浅谈springAOP和动态代理
- SpringAOP原理之动态代理
- 代理模式,JDK动态代理,SpringAOP来龙去脉
- 【SpringAOP】——JDK动态代理
- springAOP之动态代理(三)
- SpringAOP神秘面纱之动态代理
- SpringAop实现原理 --- 动态代理、cglib
- java 代理模式,JDK动态代理,SpringAOP的实现
- 【学习心得】动态代理小结
- SpringAOP(二) 利用动态代理实现横切逻辑
- 反射实现AOP动态代理模式(SpringAOP的实现原理)
- SpringAOP之我的理解(一)------动态代理
- SpringAOP的CGLIB动态代理的底层原理实现
- Poj 2785 4 Values whose Sum is 0【二分查找】
- java高并发
- 音乐播放器
- Fragment生命周期
- 使用 OpenSSL API 进行安全编程
- SpringAOP动态代理小结
- leetcode-88-Merge Sorted Array
- NSURLConnection的3种请求方式
- python学习1
- android 百度地图画路线(驾车路线)
- 多编程-NSThread
- oracle默认的用户名和密码
- POJ 3415(后缀自动机)
- JAVA设计模式-代理模式