SpringAOP动态代理小结
2016-03-02 18:08
423 查看
学习springAOP时,顺便学习了jdk与cglb动态代理,jdk与cglb动态代理最大不同之处就是jdk动态代理是基于接口的,如果有的项目不是基于接口又想实现动态代理,就需要cglb动态代理,这里总结下AOP的动态代理。
springAOP动态代理实现方式
是基于jdk与cglb的,就是选它们一种来实现。这里涉及两个属性
springAOP的五种增强
要实现增强需写一个类实现这几个方法
写一个例子来分析引介增强
其余的增强都大同小异,不过异常增强通知是需要手动抛出一个异常的。欧了,小长我继续学习去了。
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>
其余的增强都大同小异,不过异常增强通知是需要手动抛出一个异常的。欧了,小长我继续学习去了。
相关文章推荐
- 白话Spring(基础篇)---bean之间的关系
- 基于easySchedule的定时任务管理
- java高并发
- Java对readis的基本操作
- java中常用的字符串的截取方法
- cxf框架和spring mvc的集成
- Struts2框架的传值问题
- spring bean标签的属性配置
- java程序运行机制的简单梳理
- struts国际化
- Spring定时任务的几种实现
- 再谈如何将android studio项目转换成eclipse
- 使用 Spring Data JPA 简化 JPA 开发
- 【慕课笔记】第六章 JAVA中的集合框架(下) 第8节 实现学生序列排序
- 2016年3月2日
- Spring 中Bean的生命周期与InitializingBean和DisposableBean
- 自学 java 笔记 day5(面向对象1)
- JAVA基础教程之入门学习方法
- java学习的第三阶段感想(考核例子-教务管理系统)
- SpringMVC