cglib

Spring AOP里的静态代理和动态代理,你真的了解嘛?

橙三吉。 提交于 2020-07-29 03:51:33
什么是代理?   为某一个对象创建一个代理对象,程序不直接用原本的对象,而是由创建的代理对象来控制原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间 什么是静态代理?   由程序创建或特定工具自动生成源代码,在程序运行前,代理类的.class文件就已经存在   通过将目标类与代理类实现同一个接口,让代理类持有真实类对象,然后在代理类方法中调用真实类方法,在调用真实类方法的前后添加我们所需要的功能扩展代码来达到增强的目的。 优点   代理使客户端不需要知道实现类是什么,怎么做,而客户端只需知道代理即可   方便增加功能,扩展业务逻辑 缺点   代理类中常出现大量冗余的代码,非常不利于扩展和维护   如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度 案例演示 PayService.java( 接口 ) package net.cybclass.sp.proxy; public interface PayService { /** * 支付回调 * @param outTradeNo 订单号 * @return */ String callback(String outTradeNo); /** * 下单 * @param userId 用户id *

java poi excel 导出 表头 列名 不是类属性 导出的数据一部分存放在容器里面

会有一股神秘感。 提交于 2020-07-29 03:44:55
贴上解决我自己问题的代码,当然还有其它方式,见文章后面的总结 import java.util.Iterator; import java.util.Map; import java.util.Set; import org.springframework.cglib.beans.BeanGenerator; import org.springframework.cglib.beans.BeanMap; public class DynamicDto { public DynamicDto() { super(); } /** * 目标对象 */ private Object target; /** * 属性集合 */ private BeanMap beanMap; @SuppressWarnings("unchecked") public void init(Map propertyMap) { this.target = generateBean(propertyMap); this.beanMap = BeanMap.create(this.target); } /** * 给bean属性赋值 * @param property 属性名 * @param value 值 */ public void setValue(String property, Object

Spring AOP 源码解析:注解式切面增强机制

心已入冬 提交于 2020-07-28 20:13:53
Spring AOP 源码解析:注解式切面增强机制 IoC 和 AOP 被称为 Spring 两大基础模块,支撑着上层扩展的实现和运行。虽然 AOP 同样建立在 IoC 的实现基础之上,但是作为对 OOP(Object-Oriented Programing) 的补充,AOP(Aspect-Oriented Programming) 在程序设计领域拥有其不可替代的适用场景和地位。Spring AOP 作为 AOP 思想的实现,被誉为 Spring 框架的基础模块也算是实至名归。Spring 在 1.0 版本的时候就引入了对 AOP 的支持,并且随着版本的迭代逐渐提供了基于 XML 配置、注解,以及 schema 配置的使用方式,考虑到实际开发中使用注解配置的方式相对较多,所以本文主要分析注解式 AOP 的实现和运行机制。 注解式 AOP 示例 首先我们还是通过一个简单的示例演示一下注解式 AOP 的具体使用。假设我们声明了一个 IService 接口,并提供了相应的实现类 ServiceImpl,如下: public interface IService { void sayHello(); void sayHelloTo(String name); void sayByebye(); void sayByebyeTo(String name); } @Service public

终于有人把 java代理 讲清楚了,万字详解!

大兔子大兔子 提交于 2020-07-28 19:14:42
什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 ​代理其实不仅仅是在软件开发领域,在我们的日常生活中也是时常可见。比如某p2p老板突然携款带着小姨子跑路了,可怜了下面一堆的程序员背负一身房贷,上有老下有小,程序员只能被迫去申请劳动仲裁,劳动局就会为其指派一位代理律师全权负责程序员的仲裁事宜(PS:p2p跑路仲裁拿回工资的可能性非常低,没让你把工资退回就算好的了)。那这里面就是使用了代理模式,因为在劳动仲裁这个活动中,代理律师会全权代理程序员。比如:房东要将房子出售,于是到房地产中介公司找一个中介(代理),由他来帮房东完成销售房屋,签订合同、网签、贷款过户等等事宜。 代理模式 这是常见代理模式常见的 UML 示意图。 需要注意的有下面几点: 用户只关心接口功能,而不在乎谁提供了功能。上图中接口是 Subject 。 接口真正实现者是上图的 RealSubject ,但是它不与用户直接接触,而是通过代理。 代理就是上图中的 Proxy ,由于它实现了 Subject 接口,所以它能够直接与用户接触。

设计模式在 Spring 中的应用解析(建议收藏系列)

只愿长相守 提交于 2020-07-28 18:48:03
设计模式作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记只是一直没有记忆 。 今天,就设计模式的内在价值做一番探讨,并以spring为例进行讲解,只有领略了其设计的思想理念,才能在工作学习 中运用到“无形”。 Spring作为业界的经典框架,无论是在架构设计方面,还是在代码编写方面,都堪称行内典范 。 spring中常用的设计模式达到九种,我们一一举例 : 第一种:简单工厂 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象 ,但是否是在传入 参数后创建还是传入参数前创建这个要根据具体情况来定。 如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean 。 第二种:工厂方法(Factory Method) 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式, 即应用程序将对象的创建及初始化职责交给工厂对象。 一般情况下,应用程序有自己的工厂对象来创建bean. 如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。

居然还有人这样解说mybatis运行原理

烈酒焚心 提交于 2020-07-28 17:53:30
[TOC] mybatis运行分为两部分,第一部分读取配置文件缓存到Configuration对象中。用以创建SqlSessionFactory,第二部分是SqlSession的执行过程。 Mybatis基本认识 动态代理 之前我们知道Mapper仅仅是一个接口,而不是一个逻辑实现类。但是在Java中接口是无法执行逻辑的。这里Mybatis就是通过动态代理实现的。关于动态代理我们常用的有Jdk动态代理和cglib动态代理。两种却别这里不做赘述。关于CGLIB代理在框架中使用的比较多。 关于动态代理就是所有的请求有一个入口,由这个入口进行分发。在开发领域的一个用途就是【负载均衡】 关于Mybatis的动态代理是使用了两种的结合。 下面看看JDK和cglib两种实现 JDK实现 首先我们需要提供一个接口 , 这个接口是对我们程序员的一个抽象。 拥有编码和改BUG的本领 public interface Developer { /** * 编码 */ void code(); /** * 解决问题 */ void debug(); } 关于这两种本领每个人处理方式不同。这里我们需要一个具体的实例对象 public class JavaDeveloper implements Developer { @Override public void code() { System.out

面试问到AOP就该这样回答

旧时模样 提交于 2020-07-28 17:43:06
前言   相信各位小伙伴在准备面试的时候,AOP都是无法绕过的一个点,经常能看到动态代理、JDK动态代理、CGLIB动态代理这样的字眼。其实动态代理是代理模式的一种。代理模式有静态代理、强制代理、动态代理。所以在认识AOP之前需要了解代理模式。 代理模式定义   代理模式(Proxy Pattern):为其他对象提供一种代理以控制这个对象的访问。 Subject 抽象主题角色,也叫做抽象主题类。可以是抽象类也可以是接口,是一个最普通的业务类型定义,无特殊要求。 RealSubject 具体主题角色,也叫做被委托角色,被代理角色,是业务逻辑的具体执行者。 Proxy 代理主题角色,也叫做委托类、代理类。他负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在真实主题角色处理完毕前后做到预处理和善后工作。 代理模式的优点 职责清晰 高扩展性 智能化 UML 我的理解   跳板机不管是对于运维老哥还是对于我们来讲,都是日常的工作中不可或缺的一个工具。为了保证生产服务器的安全,我们是无法通过xshell等工具直接进行连接的。如果需要操作生产的服务器,则需要通过跳板机。并且跳板机还能记录我们的操作,用来做安全审计。防止出现,某位老哥一气之下反手就是个 sudo rm -rf /* 直接凉凉。   我们回过头看看代理模式的定义:

手写SpringBoot自动配置及自定义注解搭配Aop,实现升级版@Value()功能

十年热恋 提交于 2020-07-27 13:59:27
背景 项目中为了统一管理项目的配置,比如接口地址,操作类别等信息,需要一个统一的配置管理中心,类似nacos。 我根据项目的需求写了一套分布式配置中心,测试无误后,改为单体应用并耦合到项目中。项目中使用配置文件多是取配置文件(applicatoion.yml)的值,使用@Value获取,为了秉持非侵入性的原则,我决定写一套自定义注解,以实现最少的代码量实现业务需求。 思路 需要实现类似springboot @Value注解获取配置文件对应key的值的功能。但区别在于 我是从自己写的自动配置中获取,原理就是数据库中查询所有的配置信息,并放入一个对象applicationConfigContext,同时创建一个bean交给spring托管,同时写了个aop,为被注解的属性赋入applicationConfigContext的对应的值。 换句话说,自定义的这个注解为类赋值的时间线大概是 spring bean初始化 —-> 第三方插件初始化 --> 我写的自动配置初始化 ---- 用户调用某个方法,触发aop机制,我通过反射动态改变了触发aop的对象的bean的属性,将值赋值给他。 难点 本项目的难点在于如何修改对象的值。看似简单,其实里面的文章很多。 自动配置代码 配置映射数据库pojo import lombok.AllArgsConstructor; import lombok

动态代理

和自甴很熟 提交于 2020-07-27 06:05:59
对目标对象进行增强,增强动作与目标动作分开、解耦 cglib性能较高但是费时,实用于 无需频繁创建代理对象或有实例池的代理 例子 写arrayList动态代理类 final List<String> list = new ArrayList<String>(); List<String> proxyInstance = (List<String>) Proxy.newProxyInstance(list.getClass().getClassLoader(), list.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return method.invoke(list, args); } }); proxyInstance.add("你好"); System.out.println(list); http://www.bjpowernode.com/tutorial_baseinterviewquestions/239.html 这是什么代理? http://www.bjpowernode.com/tutorial

Spring和Springboot相关知识点整理

吃可爱长大的小学妹 提交于 2020-07-25 19:58:00
简介 本文主要整理一些Spring & SpringBoot应用时和相关原理的知识点,对于源码不做没有深入的讲解。 1. 思维导图 右键新窗口打开可以放大。 说明 使用@Configuration在java代码中声明一个bean——而不是使用xml——实际上很早就有了(至少在《Spring实战(第3版)》出版时,也就是Spring3.0时),我一直以为是SpringBoot的新特性。 2. Spring 2.1 AOP术语 通知Advice —— 切面要做什么,何时执行。何时,包括方法调用前、方法调用后、方法成功调用后、方法调用抛异常后、环绕(Around)。环绕允许提供一些需要跨越方法调用前后的功能,如计算调用耗时。 连接点Joinpoint —— 应用执行时能插入切面的点。实际上是一个逻辑概念,不体现在配置中。 切点Pointcut —— 执行通知的具体的连接点。 切面Aspect —— 通知+切点 引入Introduction —— 允许为类添加新的方法或属性。(个人理解即应用使用切面中的方法和属性,就好像这些方法和属性是原生的一样。可以参考<aop:declare-parents>元素) 织入Weaving —— 将切面应用到目标对象创建新的代理对象的过程,Spring使用的是运行时。编译期和类加载时是其他的方式。 2.2 Bean的生命周期 虽然被称为生命周期