博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring课程 Spring入门篇 6-3 ProxyFactoryBean及相关内容(下)
阅读量:5339 次
发布时间:2019-06-15

本文共 9386 字,大约阅读时间需要 31 分钟。

1    解析

1.1  使用global advisors demo

1.2  jdk代理和cglib代理的选择

1.3  如何强制使用CGLIB实现AOP?

1.4  JDK动态代理和CGLIB字节码生成的区别?

1.5  cglib的maven依赖

1.6   CGLIB代理的工作原理

1.7     简化的proxy定义

1.8  父子bean demo

1.9  为什么要使用父子bean

 

2    代码演练

2.1  通配符使用 和 ProxyFactoryBean 连接点的选择

2.2  使用父子bean(parent标签使用)

 

 

 

1    解析

1.1  使用global advisors demo

用*做通配,匹配所有拦截器加入通知链,这种情况下只执行环绕通知

sa*
mooc*

 

1.2  jdk代理和cglib代理的选择

a  只有类,没有接口的话,使用cglib代理。(如2.2案例中没有bizLogic接口的话,会使用cglib代理)

b  有接口,使用jdk动态代理。

c  如果我们愿意,可以强制使用cglib代理。

 

1.3  如何强制使用CGLIB实现AOP?

1.3.1  在Spring3.2中

不用把CGLIB添加到classpath中,CGLIB被重新包装并包含在Spring核心的JAR(即基于CGLIB的AOP就像JDK动态代理一样“开箱即用”)

1.3.1  在Spring3.2之前的版本

 * 添加CGLIB库,SPRING_HOME/cglib/*.jar

 * 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

1.3.2  在spring3.2之后的版本

没试过

1.4  JDK动态代理和CGLIB字节码生成的区别?

* JDK动态代理只能对实现了接口的类生成代理,而不能针对类

 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法   因为是继承,所以该类或方法最好不要声明成final 

 

1.5  cglib的maven依赖

    1. <dependency>
    2. <groupId>cglib</groupId>
    3. <artifactId>cglib</artifactId>
    4. <version>2.2.2</version>
    5. </dependency>

1.6   CGLIB代理的工作原理

 CGLIB代理的工作原理是在运行时生成目标类的子类,Spring配置这个生成的子类委托方法调用到原来的目标,子类是用来实现Decorator模式,织入通知

 

1.7     简化的proxy定义

使用父子bean定义,以及内部bean定义,可能会带来更清洁和更简洁的代理定义(抽象属性标记父bean定义为抽象的这样它不能被实例化)

 

1.8  父子bean demo

com.imooc.aop.api.BizLogic
moocBeforeAdvice
moocAfterReturningAdvice
moocMethodInterceptor
moocThrowsAdvice

 

1.9  为什么要使用父子bean

用父子bean可以简化proxy定义,多个需要被代理的类的情况下使用父子 bean 方法会使代码更好复用

 

2    代码演练

2.1  通配符使用 和 ProxyFactoryBean 连接点的选择

测试类:

package com.imooc.test.aop;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import com.imooc.aop.api.BizLogic;import com.imooc.test.base.UnitTestBase;@RunWith(BlockJUnit4ClassRunner.class)public class TestAOPAPI extends UnitTestBase{    public TestAOPAPI() {        super("classpath:spring-aop-api.xml");        // TODO Auto-generated constructor stub    }        @Test    public void testSave(){        BizLogic bLogic = super.getbean("bizLogicImpl");        bLogic.sove();    }}

 

配置文件:

sa*
mooc*

 

实现类:

package com.imooc.aop.api;public class BizLogicImpl implements BizLogic{    @Override    public String sove() {
System.out.println("syso save"); return "BizLogicImpl save"; } }

 

接口:

package com.imooc.aop.api;public interface BizLogic {    String sove();}

 

环绕通知:

package com.imooc.aop.api;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * 引入环绕通知 *  * 实现  MethodInterceptor 接口 * @author weijingli * */public class MoocMethodInterceptor implements MethodInterceptor{    @Override    public Object invoke(MethodInvocation methodinvocation) throws Throwable {                //实现前置通知的方法        //得到方法    得到类        System.out.println("MoocMethodInterceptor1:"+methodinvocation.getMethod().getName()+"    "        +methodinvocation.getStaticPart().getClass().getName());                Object obj = methodinvocation.proceed();                //实现后置通知方法        System.out.println("MoocMethodInterceptor2:"+obj);                return obj;    }}

 

打印日志:

四月 23, 2019 6:56:02 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7fe219e7: startup date [Tue Apr 23 18:56:02 CST 2019]; root of context hierarchy四月 23, 2019 6:56:02 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [spring-aop-api.xml]MoocMethodInterceptor1:sove    java.lang.reflect.Methodsyso saveMoocMethodInterceptor2:BizLogicImpl save四月 23, 2019 6:56:04 下午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@7fe219e7: startup date [Tue Apr 23 18:56:02 CST 2019]; root of context hierarchy

 

2.2  使用父子bean(parent标签使用)

测试类:

package com.imooc.test.aop;import org.junit.Test;import org.junit.runner.RunWith;import org.junit.runners.BlockJUnit4ClassRunner;import com.imooc.aop.api.BizLogic;import com.imooc.test.base.UnitTestBase;@RunWith(BlockJUnit4ClassRunner.class)public class TestAOPAPI extends UnitTestBase{    public TestAOPAPI() {        super("classpath:spring-aop-api.xml");        // TODO Auto-generated constructor stub    }        @Test    public void testSave(){        BizLogic bLogic = super.getbean("bizLogicImpl");        bLogic.sove();    }}

 

配置文件:

sa*
com.imooc.aop.api.BizLogic
moocBeforeAdvice
moocAfterReturningAdvice
moocMethodInterceptor
moocThrowsAdvice

 

实现类:

package com.imooc.aop.api;public class BizLogicImpl implements BizLogic{    @Override    public String sove() {        System.out.println("syso save");        return "BizLogicImpl save";    }    }

 

接口:

package com.imooc.aop.api;public interface BizLogic {    String sove();}

 

前置通知:

package com.imooc.aop.api;import java.lang.reflect.Method;import org.springframework.aop.MethodBeforeAdvice;public class MoocBeforeAdvice implements MethodBeforeAdvice{        /**     * 实现MethodBeforeAdvice接口,可以在连接点之前执行     *      *      * 作用是什么?     * 将前一章中的xml配置方式改为了实现接口的实现方式 具体细节和使用参考开发文档     *      */    @Override    public void before(Method method, Object[] aobj, Object obj)            throws Throwable {        System.out.println("MoocBeforeAdvice:"+method.getName()+"     "+                obj.getClass().getName());    }}

 

环绕通知:

package com.imooc.aop.api;import org.aopalliance.intercept.MethodInterceptor;import org.aopalliance.intercept.MethodInvocation;/** * 引入环绕通知 *  * 实现  MethodInterceptor 接口 * @author weijingli * */public class MoocMethodInterceptor implements MethodInterceptor{    @Override    public Object invoke(MethodInvocation methodinvocation) throws Throwable {                //实现前置通知的方法        //得到方法    得到类        System.out.println("MoocMethodInterceptor1:"+methodinvocation.getMethod().getName()+"    "        +methodinvocation.getStaticPart().getClass().getName());                Object obj = methodinvocation.proceed();                //实现后置通知方法        System.out.println("MoocMethodInterceptor2:"+obj);                return obj;    }}

 

后置通知:

package com.imooc.aop.api;import java.lang.reflect.Method;import org.springframework.aop.AfterReturningAdvice;/** * 实现AfterReturningAdvice接口,可以在连接点之后执行 * @author weijingli * */public class MoocAfterReturningAdvice implements AfterReturningAdvice{    /**     * obj 作为输出     */    @Override    public void afterReturning(Object obj, Method method, Object[] aobj,            Object obj1) throws Throwable {        System.out.println("MoocAfterReturningAdvice:"+method.getName()+                "    类的名称:"+obj1.getClass().getName()+"    "+obj);    }}

 

打印日志:

四月 25, 2019 6:54:59 上午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7fe219e7: startup date [Thu Apr 25 06:54:59 CST 2019]; root of context hierarchy四月 25, 2019 6:54:59 上午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions信息: Loading XML bean definitions from class path resource [spring-aop-api.xml]MoocBeforeAdvice:sove     com.imooc.aop.api.BizLogicImplMoocMethodInterceptor1:sove    java.lang.reflect.Methodsyso saveMoocMethodInterceptor2:BizLogicImpl saveMoocAfterReturningAdvice:sove    类的名称:com.imooc.aop.api.BizLogicImpl    BizLogicImpl save四月 25, 2019 6:55:00 上午 org.springframework.context.support.ClassPathXmlApplicationContext doClose信息: Closing org.springframework.context.support.ClassPathXmlApplicationContext@7fe219e7: startup date [Thu Apr 25 06:54:59 CST 2019]; root of context hierarchy

 

转载于:https://www.cnblogs.com/1446358788-qq/p/10758287.html

你可能感兴趣的文章
mssql sqlserver 使用sql脚本 清空所有数据库表数据的方法分享
查看>>
分层图最短路【bzoj2763】: [JLOI2011]飞行路线
查看>>
linux下编译复数类型引发的错误:expected unqualified-id before '(' token
查看>>
codeforces 1041A Heist
查看>>
字典常用方法
查看>>
Spring Cloud Stream消费失败后的处理策略(三):使用DLQ队列(RabbitMQ)
查看>>
bzoj1048 [HAOI2007]分割矩阵
查看>>
Java中的编码
查看>>
PKUWC2018 5/6
查看>>
As-If-Serial 理解
查看>>
洛谷P1005 矩阵取数游戏
查看>>
在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构
查看>>
无线通信基础(一):无线网络演进
查看>>
如何在工作中快速成长?阿里资深架构师给工程师的10个简单技巧
查看>>
WebSocket 时时双向数据,前后端(聊天室)
查看>>
关于python中带下划线的变量和函数 的意义
查看>>
linux清空日志文件内容 (转)
查看>>
安卓第十三天笔记-服务(Service)
查看>>
Servlet接收JSP参数乱码问题解决办法
查看>>
【bzoj5016】[Snoi2017]一个简单的询问 莫队算法
查看>>