cglib

【设计模式自习室】详解代理模式

怎甘沉沦 提交于 2020-01-22 19:26:02
前言 《设计模式自习室》系列,顾名思义,本系列文章带你温习常见的设计模式。主要内容有: 该模式的 介绍 ,包括: 引子、意图(大白话解释) 类图、时序图(理论规范) 该模式的 代码示例 :熟悉该模式的代码长什么样子 该模式的 优缺点 :模式不是万金油,不可以滥用模式 该模式的 应用案例 :了解它在哪些重要的源码中被使用 该系列会逐步更新于我的博客和公众号(博客见文章底部),也希望各位观众老爷能够关注我的个人公众号: 后端技术漫谈 ,不会错过精彩好看的文章。 系列文章回顾 【设计模式自习室】开篇:为什么我们要用设计模式? 【设计模式自习室】建造者模式 【设计模式自习室】原型模式 【设计模式自习室】透彻理解单例模式 【设计模式自习室】理解工厂模式的三种形式 【设计模式自习室】适配器模式 【设计模式自习室】装饰模式 【设计模式自习室】桥接模式 Bridge Pattern:处理多维度变化 【设计模式自习室】门面模式 Facade Pattern 【设计模式自习室】享元模式 Flyweight Pattern:减少对象数量 结构型——代理模式 Proxy Pattern 引子 通俗的来讲,代理模式就是我们生活中常见的 中介 。在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。 为什么要用代理模式 中介隔离作用 :在某些情况下

Java动态代理(invocation handler、cglib)简析

痞子三分冷 提交于 2020-01-21 18:46:43
What 代理模式 Java的一种设计模式, 他的特征是与委托类有相同的接口,但是并不具体实现真正的服务 作用: 消息预处理 过滤消息 把消息转发给委托类 消息的事后处理 代理的分类: 静态代理:把已存在的编译文件重新编译 动态代理:在程序运行的时候通过反射机制动态创建 JAVA的动态代理主要是: JDK自带的proxy cglib (code generation library) 什么是ASM? 一个字节码操控框架,可以增强既有类的功能、生成新的类。 JAVA class被描述成一棵树, asm使用 visitor模式 来遍历整个二进制结构 JDK-InvocationHandler 委托类必须实现接口,不能代理普通类(没有接口的类) 代理类必须实现InvocationHandler的接口,例子如下: public Object invoke ( Object proxy , Method method , Object [ ] args ) throws Throwable { //do something before //execute, target is the real implemation class(Delegate) result = method . invoke ( target , args ) ; //do something after

JAVA实现代理模式的3种方式

≯℡__Kan透↙ 提交于 2020-01-21 05:36:23
什么是代理模式 代理模式是项目中常用的一种设计模式。提供了间接访问目标对象的一种方式;即通过代理对象访问目标对象。 这样做的好处是,可以在不改变原有目标对象的基础上,对目标对象增加额外的扩展功能。 代理模式又分为静态代理、jdk动态代理、cglib动态代理三种实现方式。 三种实现方式各有优点,以及适用的场景。 一、静态代理 被代理对象与代理对象需要实现相同的接口或者是继承相同父类,因此要定义一个接口或抽象类。 /**代理接口*/ public interface IHello { String hi ( String key ) ; } /**代理接口实现类*/ public class HelloImpl implements IHello { @Override public String hi ( String key ) { String str = "hello:" + key ; System . out . println ( "HelloImpl! " + str ) ; return str ; } } /**静态代理类*/ public class HelloStaticProxy implements IHello { private IHello hello ; public HelloStaticProxy ( IHello hello ) { this

spring框架理解

梦想的初衷 提交于 2020-01-14 00:01:01
Spring AOP 描述一下Spring AOP 面向切面编程,可以看作是对OOP(面向对象编程)的一种补充,传统的OOP开发中代码逻辑是自上而下的,在这些自上而下的过程中会产生横切的问题,而这些横切性的问题又与我们业务逻辑关系不大。AOP让你可以使用简单可插拔的配置,在实际逻辑执行之前、之后或周围动态添加横切关注点。这让代码在当下和将来都变得易于维护。spring AOP可以通过注解和XML两种方式实现。 Spring中有哪些不同的通知类型 1、前置通知(Before Advice):在连接点之前执行Advice @Before 2、返回之后通知(After Retuning Advice):在连接点正常执行结束之后执行Advice @AfterReturning 3、抛出异常后执行通知(After Throwing Advice):方法抛出异常退出后执行该通知 @AfterThrowing 4、后置通知(After advice):无论连接点是通过什么方式退出(正常返回或者抛出异常)都会在执行结束时执行该通知 @After 5、环绕通知(Around advice):围绕连接点执行Advice @Around SpringAOP增强一个类,是在什么时候完成? 在spring初始化得时候完成增强。 Spring AOP 代理是什么? 代理是使用非常广泛的设计模式。简单来说,

Same class invoke NOT effective in Spring AOP cglib

时间秒杀一切 提交于 2020-01-13 19:56:14
问题 Suppose we have following class @Service class MyClass { public void testA() { testB(); } @Transactional public void testB() { ... } } Now, if we invoke myClass.testA(); in test, then @Transactional on testB will not take effect. The reason I think is following. Cglib will create a proxy bean for MyClass , like this: Class Cglib$MyClass extends MyClass { @Override public void testB() { // ...do transactional things super.testB(); } } Now we invoke myClass.testA() , which will invoke MyClass

代理模式

戏子无情 提交于 2020-01-13 18:11:32
代理模式 经过学习整理后来输出心得 静态代理 public interface Person { void findLove ( ) ; } public class Son implements Person { @Override public void findLove ( ) { System . out . println ( "找美女" ) ; } } //父亲就是儿子的代理类 public class Father implements Person { private Son son ; public Father ( Son son ) { this . son = son ; } @Override public void findLove ( ) { before ( ) ; son . findLove ( ) ; after ( ) ; } void before ( ) { System . out . println ( "开始物色" ) ; } void after ( ) { System . out . println ( "结束" ) ; } } public class Test { public static void main ( String [ ] args ) { Father father = new Father ( new

JDK动态代理与CGLIB动态代理

爱⌒轻易说出口 提交于 2020-01-13 08:23:24
JDK动态代理和CGLIB动态代理是SpringAOP非常重要的两个概念,SpringAOP是通过生成目标对象的代理类来实现对目标对象的增强,在说JDK的动态代理之前我们先来回顾一下静态代理: 一、静态代理: 首先定义一个业务接口 public interface ITestService { void sayHello(); String getMsg(); } 然后我们编写一个简单的实现类: public class TestServiceImpl implements ITestService{ @Override public void sayHello() { System.out.println("TestServiceImpl sayHello"); } @Override public String getMsg() { return "TestServiceImpl Msg"; } } 然后我们再编写一个代理类用来代理TestServiceImpl: public class TestServiceProxy implements ITestService { private ITestService target; public TestServiceProxy(ITestService testService) { this.target =

实现Spring JDK代理和CGLIB代理

会有一股神秘感。 提交于 2020-01-13 02:51:06
JDK代理: JDK动态代理其实也是基本接口实现的。因为通过接口指向实现类实例的多态方式,可以有效地将具体实现与调用解耦,便于后期的修改和维护。 创建"Car"接口: package com . example . demo ; /** * 定义Car接口 */ public interface Car { void whatCar ( ) ; } 2.创建"Mazda"类,实现接口"Car",并实现方法"whatCar": package com . example . demo ; public class Mazda implements Car { @Override public void whatCar ( ) { System . out . println ( "I am Mazda" ) ; } } 3.创建一个动态代理类,需要实现InvocationHandler接口,代码中有详细注解: package com . example . demo ; import java . lang . reflect . InvocationHandler ; import java . lang . reflect . Method ; import java . lang . reflect . Proxy ; /** * 创建一个动态代理类

设计模式@第15章:代理模式

做~自己de王妃 提交于 2020-01-10 23:02:54
第15章:代理模式 一、代理模式(Proxy) (一)代理模式的基本介绍 代理模式: 为一个对象提供一个替身,以控制对这个对象(被代理的对象)的访问 。即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能。 被代理的对象可以是远程对象、创建开销大的对象或需要安全控制的对象; 代理模式有不同的形式, 主要有三种 静态代理 、 动态代理 (JDK 代理、接口代理)和 Cglib 代理 (可以在内存动态的创建对象,而不需要实现接口, 他是属于动态代理的范畴) 。 代理模式示意图 二、静态代理 (一)静态代码模式的基本介绍 静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一起实现相同的接口或者是继承相同父类 (二)应用实例 具体要求 定义一个接口:ITeacherDao 目标对象 TeacherDAO 实现接口 ITeacherDAO 使用静态代理方式,就需要在代理对象 TeacherDAOProxy 中也实现 ITeacherDAO 调用的时候通过调用代理对象的方法来调用目标对象. 特别提醒:代理对象与目标对象要实现相同的接口,然后通过调用相同的方法来调用目标对象的方法 思路分析图解(类图) 代码实现 接口:ITeacherDao package com.gjxaiou.proxy

@Transactional详解

我是研究僧i 提交于 2020-01-10 10:59:26
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 看源码 public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default TransactionDefinition.TIMEOUT_DEFAULT; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }