cglib

Spring框架IOC和AOP的实现原理(概念)

非 Y 不嫁゛ 提交于 2020-05-08 08:28:53
IoC(Inversion of Control) (1). IoC(Inversion of Control)是指容器控制程序对象之间的关系,而不是传统实现中,由程序代码直接操控。控制权由应用代码中转到了外部容器,控制权的转移是所谓反转。 对于Spring而言,就是由Spring来控制对象的生命周期和对象之间的关系;IoC还有另外一个名字——“依赖注入(Dependency Injection)”。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,即由容器动态地将某种依赖关系注入到组件之中。 (2). 在Spring的工作方式中,所有的类都会在spring容器中登记,告诉spring这是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。 (3). 在系统运行中,动态的向某个对象提供它所需要的其他对象。 (4). 依赖注入的思想是通过反射机制实现的,在实例化一个类时,它通过反射调用类中set方法将事先保存在HashMap中的类属性注入到类中 。 总而言之,在传统的对象创建方式中

23种设计模式介绍(二)---- 结构型模式

╄→гoц情女王★ 提交于 2020-05-08 00:49:04
概述   结构型模式共七种: 适配器模式(Adapter)         外观模式(Facade) 桥接模式(Bridge) 装饰器模式(Decorator) 代理模式(Proxy) 享元模式(Flyweight) 组合模式(Composite)   其中又分为   接口适配:适配器、外观、桥接模式   行为扩展:装饰   性能与对象访问:代理、享元模式   抽象集合:组合模式 一、适配器模式   定义:将一个类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。   角色:适配器(Adapter)、被适配类、对象(Adaptee)   理解:客户需要Target,现实只有Adaptee,可以用一个实现Target协议的适配器通过类继承或者对象组合类获得被Adaptee。   类图:      例子代码: // 原有的接口,不符合客户要求 interface IOrigin{ public void deal(); } // 定义一个符合客户要求的新接口 interface ITarget{ public void newDeal( int type); } class Target implements ITarget{ private IOrigin origin; public void newDeal( int

springboot开启事务支持时报代理错误

梦想的初衷 提交于 2020-05-08 00:15:08
问题: The bean 'xxx' could not be injected as a 'com.github.service.xx' because it is a JDK dynamic proxy 先说说问题的来源吧,当前这个问题是我在springboot配置事务时出现的,本来我搭建了一个springboot的web框架后,启动事务配置只需要如下两步即可完成: 1.在启动类Application类上设置@EnableTransactionManagement,表示启动springboot事务支持 2.在Service层的实现类中指定的方法上设置@Transactional 以上简单的两步即可完成,但偏偏在启动后会报如上错误。通过观察控制台报错的原因如下: Console描述1: Description: The bean 'userServiceImpl' could not be injected as a 'com.ysq.springboot.service.Impl.UserServiceImpl' because it is a JDK dynamic proxy that implements: com.ysq.springboot.service.UserService 根据上面描述,它是在我的Action层中

JDK动态代理VS CgLib

試著忘記壹切 提交于 2020-05-07 20:24:32
业务场景 描述:每个旅客乘坐火车时,在上车、下车之前需要检票。站在乘客的角度,这个过程可以看做一件事:检票坐车检票;也可以看做两件事:检票,坐车;站在检票员的角度,那就是一件事,检票。 如果我们用代码实现,可能是这样的过程: checkTicket(); takingTrain(); checkTicket(); 如果有一天,车站变成刷身份证进站了,我们就得回去改代码了... 下面我们将这个过程分开,用代理来解决坐车意外的问题: 业务逻辑:坐火车 额外需要:检票/刷卡 具体实现 JDK动态代理,主要类、接口:Proxy, InvocationHandle,JDK动态代理特点只能对接口进行代理 所以需要一个业务逻辑接口:TakingTrain; package com.spring.mybean; public interface TakingTrain { public void takeTrain(String name); } 实现类:TakingTrainImpl------>要被代理的目标类,实现TakingTrain接口 package com.spring.mybean.imp; import com.spring.mybean.TakingTrain; public class TakingTrainImpl implements TakingTrain {

【趣味设计模式系列】之【策略模式】

杀马特。学长 韩版系。学妹 提交于 2020-05-07 07:53:23
1. 简介 策略模式(strategy):定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。 2. 图解 商城搞多种优惠活动,顾客只能参与其中一种优惠算法。 3. 案例实现 类图 FullDistcount 满200减20元; FirstPurchaseDiscount 首次购买减20元; SecondPurchaseDiscount 第二件打9折; HolidayDiscount 节日一律减5元. 代码实现如下,环境类 package com.wzj.strategy; /** * @Author: wzj * @Date: 2020/5/5 21:25 * @Desc: 优惠类:环境类 */ public class Context { private int price; private Discount discount; public Context(int price, Discount discount) { this.price = price; this.discount = discount; } public int getPrice() { return this.discount.calculateBySourcePrice(this.price); } } 折扣接口类 package com.wzj.strategy; /** *

Java设计模式学习记录-代理模式

帅比萌擦擦* 提交于 2020-05-05 12:16:49
代理模式 代理模式是常见设计模式的一种,代理模式的定义是: 为其他对象提供一种 代理 以控制对这个对象的访问 。 在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 静态代理 理解设计模式是比较枯燥的,所以还是以举例子的方式来进行理解, 例如:公司开年会想找个明星来表演,那么并不会直接联系明星(主要还是联系不上),而是会联系明星的经纪人,明星就是被代理的对象,而经纪人就是代理对象。明星只需要准备来参加年会时应该表演什么节目就可以,其他的出场费之类的事情就交给经纪人来处理就好了。代理对象可以理解为被代理对象的扩展,能做被代理对象不能做的事情,也可以调用代理对象做事情。 那么用代码实现这个场景是什么样子的呢? 执行合作方法的接口 /** * @Description: 经纪公司接口,代理对象和被代理对象都需要实现的接口 */ public interface Company { /** 合作 */ void cooperation(); } 被代理对象 /** * @Description: 目标对象-明星(被代理对象) */ public class Start implements Company { @Override public void cooperation() { System.out.println( "is

面试填坑笔记-从代理模式到SpringAOP的动态代理

。_饼干妹妹 提交于 2020-05-05 12:16:01
代理模式是一种理论上非常简单,但是各种地方的实现往往却非常复杂。本文将从代理模式的基本概念出发,探讨代理模式在java领域的应用与实现。读完本文你将get到以下几点: 为什么需要代理模式,它通常用来解决什么问题,以及代理模式的设计与实现思路 Java领域中代理模式3种不同实现类型(静态代理,jdk动态代理,cglib) 代理模式的面试考点 为什么要使用代理模式 在生活中我们通常是去商场购买东西,而不是去工厂。最主要的原因可能有以下几种: 成本太高,去工厂路途遥远成本太高,并且可能从工厂进货要办理一些手续流程; 工厂不直接卖给你,毕竟可能设计到一些行业机密或者无良厂家有一些不想让你知道的东西; 商场能提供一些商品之外的服务,商场里有舒适的温度,整洁的洗手间,当然还有漂亮的小姐姐。 在面向对象的系统中也有同样的问题**,有些对象由于某种原因,比如对象创建开销很大,或者某些操作需要安全控制等,直接访问会给使用者或者系统结构带来很多麻烦,这时我们就需要考虑使用代理模式**。 在应用中我们可能会用代理模式解决以下问题: 权限控制与日志 , 在客户端请求接口时我们可能需要在调用之前对权限进行验证,或者通过记录接口调用前后时间,统计执行时长,又或者说我们需要记录用户的一些操作日志信息等,我们可以对原接口进行代理,然后根据需求在接口执行前后增加一些特定的操作。 重量级操作 , 比如创建开销大的对象

Java中jdk代理和cglib代理

陌路散爱 提交于 2020-05-05 12:14:43
代理模式 给某一个对象提供一个代理,并由代理对象控制对原对象的引用。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 在Java中代理模式从实现方式上可以分为两个类别:静态代理和动态代理 静态代理: 也就是我们学习设计模式之代理模式时常见的事例,具体不在赘述,参见: 【Java设计模式-13代理模式】 动态代理: 在静态代理中,因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类。同时,一旦接口增加方法,目标对象与代理对象都要维护。那么如何解决这种问题呢?答案就是动态代理,下面会使用两种动态代理(jdk代理、cglib代理)分别实现同一个事例来体会一下动态代理的实现。 动态代理 动态代理具有以下特性: 1.代理对象不需要实现接口 2.代理对象的生成,是利用JDK的API,动态的在内存中构建代理对象 jdk代理 只支持对接口的的实现,其实现主要通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。 Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。 JDK的动态代理用起来非常简单,但它有一个限制,就是使用动态代理的对象必须实现一个或多个接口 package com.lkf.parttern

设计模式:代理模式是什么,Spring AOP还和它有关系?

橙三吉。 提交于 2020-05-05 12:13:52
接着学习设计模式系列,今天讲解的是代理模式。 定义 什么是代理模式? 代理模式,也叫委托模式,其定义是给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。它包含了三个角色: Subject:抽象主题角色。可以是抽象类也可以是接口,是一个最普通的业务类型定义。 RealSubject:具体主题角色,也就是被代理的对象,是业务逻辑的具体执行者。 Proxy:代理主题角色。负责读具体主题角色的引用,通过真实角色的业务逻辑方法来实现抽象方法,并在前后可以附加自己的操作。 用类图来表示的话大概如下: 我们可以用举一个电影演员拍戏的例子,一般来说,演员最主要的工作就是演戏,其他的事可以交给他的经纪人去做,例如谈合同,安排档期等等,而负责这些场外工作的经纪人就相当于 Proxy ,而负责核心业务的演员就是 RealSubject 。 这就是代理模式的设计思路,除此之外,代理模式分为静态代理和动态代理,静态代理是我们自己创建一个代理类,而动态代理是程序自动帮我们生成一个代理类,可以在程序运行时再生成对象,下面分别对它们做介绍。 静态代理 静态代理在程序运行之前,代理类.class文件就已经被创建了。还是用上面演员演戏的例子,在静态代理模式中,我们要先创建一个抽象主题角色 Star , public interface Star { // 演戏 void act(); }

【java虚拟机】jvm内存模型

感情迁移 提交于 2020-05-04 04:44:42
作者:pengjunlee 原文链接:https://blog.csdn.net/pengjunlee/article/details/71909239 目录 一、运行时数据区域    1、程序计数器    2、Java 虚拟机栈    3、本地方法栈    4、Java 堆    5、方法区    6、运行时常量池    7、直接内存 二、OutOfMemoryError异常    1、Java堆溢出    2、虚拟机栈和本地方法栈溢出    3、方法区和运行时常量池溢出    4、本机直接内存溢出 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   参考书籍:《深入理解Java虚拟机——JVM高级特性与最佳实践(第2版)》   Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域都有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而存在,有些区域则是依赖用户线程的启动和结束而建立和销毁