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
原创粉丝点击