cglib

SpringAOP源码之 --- 入口

泄露秘密 提交于 2020-02-24 13:03:38
在查找AOP源码的时候,不知道如何下手,网上找了很多资料,分析源码后,来记录一下AOP的入口: BeanDefinition的解析 首先对spring.xml中文件的中的<aop:aspectj-autoproxy/>进行解析,如果发现不是bean标签,则会采用不同的类来解析。解析AOP的是AopNameSpaceHandler,追踪到init中,可以看到如下: registerBeanDefinitionParser("aspectj-autoproxy", new AspectJAutoProxyBeanDefinitionParser()); //配置为<aop:aspectj-autoproxy>时,通过这个BeanDefininationParser来处理 进入这个类的parse函数,解析器AspectJAutoProxyBeanDefinitionParser由BeanDefinitionParser接口统一实现: 进入到registerAspectJAnnonationAutoProxyCreatorIfNecessary方法: public static void registerAspectJAnnotationAutoProxyCreatorIfNecessary( ParserContext parserContext, Element

CGLIB(Code Generation Library)详解

大城市里の小女人 提交于 2020-02-24 08:47:23
文章目录 什么是CGLIB 为什么使用CGLIB CGLIB组成结构 例子 常用的API Enhancer ImmutableBean Bean generator Bean Copier BulkBean BeanMap keyFactory Mixin(混合) String switcher Interface Maker Method delegate MulticastDelegate Constructor delegate Parallel Sorter(并行排序器) FastClass 注意 CGLIB和Java动态代理的区别 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib 为什么使用CGLIB CGLIB代理主要通过对字节码的操作,为对象引入间接级别,以控制对象的访问。我们知道Java中有一个动态代理也是做这个事情的,那我们为什么不直接使用Java动态代理,而要使用CGLIB呢

Self-invocation behaviour in @Configuration vs. @Component classes

 ̄綄美尐妖づ 提交于 2020-02-22 07:46:48
问题 My question is about AOP Spring behaviour in case of internal method calls. @Service class Service { @Transactional public void method1() { method1(); } @Transactional public void method2() {} } If we call method1() from outside, method1() will be executed in a transaction mode, but as it calls internally method2(), the code inside method2() will not be executed in a transaction mode. In parallel, for a Configuration class, normally we should have the same behaviour: @Configuration class

Self-invocation behaviour in @Configuration vs. @Component classes

痴心易碎 提交于 2020-02-22 07:46:45
问题 My question is about AOP Spring behaviour in case of internal method calls. @Service class Service { @Transactional public void method1() { method1(); } @Transactional public void method2() {} } If we call method1() from outside, method1() will be executed in a transaction mode, but as it calls internally method2(), the code inside method2() will not be executed in a transaction mode. In parallel, for a Configuration class, normally we should have the same behaviour: @Configuration class

java动态代理(JDK和cglib)详解

岁酱吖の 提交于 2020-02-19 03:37:16
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 首先看一下静态代理: 1、Count.java Java代码 package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); } 2、CountImpl.java Java代码 package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author

Cglib动态代理

*爱你&永不变心* 提交于 2020-02-16 21:32:49
JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了。CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。JDK动态代理与CGLib动态代理均是实现Spring AOP的基础。 委托类: package com.reflect.proxy; public class GunDog1 { public void info() { System.out.println("我是一只美丽的猎狗"); } public void run() { System.out.println("我非常的奔跑迅速"); } } 通用的方法: package com.reflect.proxy; public class DogUtil { public void method1(){ System.out.println("=====模拟第1个通用方法======"); } public void method2(){ System.out.println("=====模拟第2个通用方法======"); } } 代理类“: interceptor(Object obj,Method method,Object[] args ,MethodProxy

Java动态代理的实现方法

一世执手 提交于 2020-02-16 20:57:34
AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行。不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdviseInterceptor等)。 那么动态代理是如何实现将切面逻辑(advise)织入到目标类方法中去的呢?下面我们就来详细介绍并实现AOP中用到的两种动态代理。 AOP的源码中用到了两种动态代理来实现拦截切入功能:jdk动态代理和cglib动态代理。两种方法同时存在,各有优劣。jdk动态代理是由 Java 内部的反射机制来实现的,cglib动态代理底层则是借助asm来实现的。总的来说,反射机制在生成类的过程中比较高效,而asm在生成类之后的相关执行过程中比较高效(可以通过将asm生成的类进行缓存,这样解决asm生成类过程低效问题)。还有一点必须注意:jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。。 1、定义接口和实现 package com

设计模式之代理模式

…衆ロ難τιáo~ 提交于 2020-02-14 17:44:03
代理模式 基本介绍 代理模式:为一个对象提供一个替身,以控制对这个对象的访问。即通过代理 对象访问目标对象.这样做的好处是: 可以在目标对象实现的基础上,增强额外的 功能操作,即 扩展目标对象的功能 。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象 代理模式有不同的形式, 主要有三种 静态代理、动态代理 (JDK代理、接口代 理)和 Cglib代理 (可 1.静态代理 静态代码模式的基本介绍 静态代理在使用时,需要定义 接口或者父类 ,被代理对象(即目标对象)与代理对象一 起实现相同的接口或者是继承相同父类 应用实例  具体要求 定义一个接口:ITeacherDao 目标对象TeacherDAO实现接口ITeacherDAO 使用静态代理方式,就需要在代理对象TeacherDAOProxy中也实现ITeacherDAO 调用的时候通过调用代理对象的方法来调用目标对象. 特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来 调用目标对象的方法。 代码编写: 定义一个接口:ITeacherDao /** * @author 孙一鸣 on 2020/2/13 */ public interface ITeacherDao { void teach ( ) ; } 目标对象TeacherDAO实现接口ITeacherDAO /** * @author

深入理解Spring事务的那点事

亡梦爱人 提交于 2020-02-14 11:35:40
Spring事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: 获取连接 Connection con = DriverManager.getConnection() 开启事务con.setAutoCommit(true/false); 执行CRUD 提交事务/回滚事务 con.commit() / con.rollback(); 关闭连接 conn.close(); 使用Spring的事务管理功能后,我们可以不再写步骤 2 和 4 的代码,而是由Spirng 自动完成。那么Spring是如何在我们书写的 CRUD 之前和之后开启事务和关闭事务的呢?解决这个问题,也就可以从整体上理解Spring的事务管理实现原理了。下面简单地介绍下,注解方式为例子 配置文件开启注解驱动,在相关的类和方法上通过注解@Transactional标识。 spring 在启动的时候会去解析生成相关的bean,这时候会查看拥有相关注解的类和方法,并且为这些类和方法生成代理,并根据@Transaction的相关参数进行相关配置注入,这样就在代理中为我们把相关的事务处理掉了(开启正常提交事务,异常回滚事务)。 真正的数据库层的事务提交和回滚是通过binlog或者redo

Java实现动态代理的两种方式

大城市里の小女人 提交于 2020-02-12 03:05:20
一般而言,动态代理分为两种,一种是JDK反射机制提供的代理,另一种是CGLIB代理。在JDK代理,必须提供接口,而CGLIB则不需要提供接口,在Mybatis里两种动态代理技术都已经使用了,在Mybatis中通常在延迟加载的时候才会用到CGLIB动态代理。 1.JDK动态代理: public interface Rent { public void rent(); } public class Landlord implements Rent{ @Override public void rent() { System.out.println("房东要出租房子了!"); } } import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class Intermediary implements InvocationHandler{ private Object post; Intermediary(Object post){ this.post = post; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object