cglib

spring源码解析之AOP原理

雨燕双飞 提交于 2020-08-08 09:38:47
一、准备工作    在这里我先简单记录下如何实现一个aop: AOP:【动态代理】 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式; 1、导入aop模块;Spring AOP:(spring- aspects) 2 、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx) 3 、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行; 通知方法: 前置通知(@Before):logStart:在目标方法(div)运行之前运行 后置通知(@After):logEnd:在目标方法(div)运行结束之后运行(无论方法正常结束还是异常结束) 返回通知(@AfterReturning):logReturn:在目标方法(div)正常返回之后运行 异常通知(@AfterThrowing):logException:在目标方法(div)出现异常以后运行 环绕通知(@Around):动态代理,手动推进目标方法运行(joinPoint.procced()) 4 、给切面类的目标方法标注何时何地运行(通知注解); 5 、将切面类和业务逻辑类(目标方法所在类)都加入到容器中; 6 、必须告诉Spring哪个类是切面类

JAVA OOP 编程-常用设计模式

帅比萌擦擦* 提交于 2020-08-07 09:24:02
smart-design-pattern 💥 👿 吼吼!10分钟内快速回顾所有设计模式及应用场景 其实,工作三年以上,精通coding,深知并发编程,熟悉OOP思想,但却因为种种原因! 没有在学习生涯初期就看设计模式的同学!尤其适合看下本项目! 让你在极短的时间内,增加自己的编程内功,从此成为抽象派coding达人, 走向人生巅峰 ! 设计模式 单例模式 1、如何实现一个单例对象;2、如何实现一个并发安全的单例对象(Double Check Lock) 工厂模式 1、简单工厂;2、简单工厂升级版;3、抽象工厂 代理模式 1、通过Java代码实现静态代理 2、JDK动态代理的实现 3、CGLIB动态代理的实现 4、基于SpringAop拦截所有的Controller层,实现统一的接口访问日志功能; 观察者模式 继承JDK原生提供的Observable类实现被观察者,以及实现Observer观察者接口,从而实现观察者模式的联动; 策略模式 将一个接口作为对象参数进行传参,通过接口的多态性质,从而实现各种不同实现类的效果调用; 适配器模式 在不改变原有代码的情况下使其具备其它代码的特性(采用继承和组合的方式) 模板模式 也是一个很舒服的设计模式之一,可以让你更加加深对父类(抽象类)的使用和理解; 此处重点说明下模板模式的原理以及JDK双亲委派机制对模板模式的运用; 装饰器模式

剑指Java自研框架,决胜Spring源码 学习笔记

醉酒当歌 提交于 2020-08-06 04:29:06
剑指Java自研框架,决胜Spring源码 学习笔记 来自慕课网: https://coding.imooc.com/class/chapter/420.html#Anchor 文章最后又下载链接: 第1章 课程导学与概览【为源码学习和框架开发备好足够弹药】 本章首先:纵观课程所有知识点。其次:讲解通用得学习成长路线;最后:明确学习本课程所需得前置要求。帮助小伙伴选择好的课,对的课,以及跟对师父,让学习成长事半功倍。 1-1 剑指造轮子,决胜Spring源码 试看 1-2 学前需知 第2章 环境准备【磨刀不误砍柴工】 本章将领小伙伴一起将Spring的源码环境搭建好。同时,咱们还会搭建业务项目的初始化环境,确保万事俱备。 2-1 Spring模块梳理 2-2 Spring源码的下载和编译 2-3 Spring源码的下载和编译 2-4 自研框架的整体介绍及雏形搭建 2-5 本章小结 第3章 业务系统架子的构建【自研框架的起源】 本章从0去基于一个简单的业务:从需求分析、技术设计,代码实现。期间涵盖:经典得MVC架构以及相关设计模式。采用问题驱动式教学,先抛出问题启发思考对比多种方案,最终借鉴Spring框架DispatcherServlet解决问题。 3-1 项目业务梳理、数据库和实体类的设计 3-2 项目依赖配置以及门面模式讲解 3-3 项目依赖配置以及门面模式讲解 3-4

Spring AOP是怎么实现的?

别等时光非礼了梦想. 提交于 2020-08-06 03:58:09
介绍 Spring AOP的实现和IOC的实现比起来还是比较简单的。在正式介绍流程之前,先介绍一个接口 public interface BeanPostProcessor { // 在bean初始化之前执行 @Nullable default Object postProcessBeforeInitialization ( Object bean , String beanName ) throws BeansException { return bean ; } // 在Bean初始化之后执行 @Nullable default Object postProcessAfterInitialization ( Object bean , String beanName ) throws BeansException { return bean ; } } 这个接口在Spring中应该算是一个很重要的接口了,是Spring框架的扩展点之一。让程序员可以扩展Bean的产生过程。在后续的文章《Spring Bean的创建过程》我会详细介绍这个接口。确认过眼神,是一篇长文,因为流程确实长。 还是老样子,Spring的Bean的初始化过程其实比较复杂,为了方便理解,我就把Spring Bean的初始化过程分为2部分 bean的实例化过程,即调用构造函数将对象创建出来 bean的初始化过程

动态获取方法参数的坑

穿精又带淫゛_ 提交于 2020-08-05 14:46:02
问题 问题的背景: 由于springcache并不是很好用,并不针对细粒度的过期时间控制。所以我司基于spel表达式写了一个缓存切面实现类似的功能。 但近期发现在使用过程中有产生缓存的时候key为null的情况。 问题的表现主要是发现有redis中有时候用户的redis缓存里面居然存在key后缀为null的缓存数据,但是值却有用户信息: 原因 经偶然间,发现突然复现了这个问题,于是开始深入debug,发现原来spring自带的ParameterNameDiscoverer(用于获取方法参数名的工具)解析方法参数名的时候是用ASM(一个字节码操作框架,Cglib就是用的这个)解析的class文件获取的参数名。在ParameterNameDiscoverer内部的方法中,发现解析的class输入流居然为null,为什么勒,于是猜测磁盘文件的class不存在了。于是重启项目,发现能够顺利获取参数名,执行mvn clean命令后就获取不到了。又由于在解析参数名的时候每次都new了LocalVariableTableParameterNameDiscoverer对象获取的,所以没有应用到其自带的缓存机制,导致该问题较频繁的出现。 在思考线上测试环境的问题,原来线上jenkens执行的脚本是先复制文件在kill进程。 解决方案 调整redis缓存切面

Spring葵花宝典

不打扰是莪最后的温柔 提交于 2020-08-05 09:24:14
一 Spring简介 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 为了解决企业应用开发的复杂性而创建 二 Spring功能 1. 方便解耦 简化开发 Spring就是一个大工厂 专门负责生成Bean 可以将所有对象创建和依赖关系维护交给Spring管理 2. AOP编程的支持 Spring提供面向切面编程 可以方便的实现对程序进行权限拦截 运行监控等功能 3. 声明式事务的支持 只需要通过配置就可以完成对事务的管理 而无需手动编程 4. 方便程序的测试 Spring对Junit4支持 可以通过注解方便的测试Spring程序 5. 方便集成各种优秀框架 Spring不排斥各种优秀的开源框架 其内部提供了对各种优秀框架的支持 6. 降低JavaEE API的使用难度 对JavaEE开发中一些难用的API(JDBC JavaMail WebService等) 都提供了封装 使这些API应用难度大大降低 三 Spring体系结构 四 Spring初体验 1. 新建一个Maven项目 pom.xml <? xml version="1.0" encoding="UTF-8" ?> < project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001

Java程序员的薪资取决于年限还是技术?

大憨熊 提交于 2020-08-05 09:23:16
  1、拿多少钱跟有多少经验有关系,但经验的多少跟年限没有必然关系   你工作以后一直在别人设置好的框架体系里搬砖,即便干了5年还不是初级程序猿一个   你工作以后,不断摸索,自己研究框架,自己在搬砖的同时还应用设计模式,有机会还自己玩架构,初级的如SSH,高级一点的,自己也能上手。J2EE、J2SE、J2ME都干过项目。   2、其实,搞技术的,自己几斤几两,自己心里清楚   至于薪水,纯搬砖的,3年经验万把块吧。能自己搭建架构,熟练应用SSH的,20k+。在这基础上,做过牛B项目的,对大数据,高并发都有深入理解的,30k+。后面的,就不说了。   3、我相信3年时间,凭技术拿到30k+已经是极限了   当然,如果你英语好,沟通能力强,写文档很棒都会增加你的薪资水平。我们在看看去到招聘网上看看要求,基本上只要工作一定时间的,基本上能接近这个标准的税前工资。   像阿里这种公司的待遇应该是目前互联网行业公司中待遇排在前列的,需要掌握的技术是NIO、类加载原理、动态代理、CGLIB、GC的原理、JVM内存模型、性能优化手段、了解并发基础变成最优等等技术。   所以年限固然是一部分但是最重要的还是技术,如果有年限但是没技术人家根本不会考虑你,有技术差点年限我认为问题不大。   4、其实互联网这个行业一直都是技术优先   不可能因为你的工作经验多但是技术不行而拿高薪

一文读懂Java中的动态代理

扶醉桌前 提交于 2020-08-05 02:56:51
从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂 动态代理 ,应从 代理模式 说起。而实现代理模式,常见有下面两种实现: (1) 代理类 关联 目标对象,实现目标对象实现的接口 public class Proxy implements Subject { // 维持一个对真实主题对象的引用 private RealSubject realSubject; public Proxy(RealSubject realSubject) { this.realSubject = realSubject; } public void preRequest() { // ... } public void postRequest() { // ... } @Override public void request() { preRequest(); // 调用真实主题对象的方法 realSubject.request(); postRequest(); } } (2) 代理类 继承 目标类,重写需要代理的方法 public class Proxy extends RealSubject { public void preRequest() { // ... } public void postRequest() { // ... } @Override

spring使用了哪些设计模式

痞子三分冷 提交于 2020-08-04 10:16:24
Spring 中使用了哪些设计模式? 好了,话不多说,开始今天的内容。spring中常用的设计模式达到九种,我们举例说明。 Spring 框架中用到了哪些设计模式: 工厂设计模式 : Spring使用工厂模式通过 BeanFactory 、 ApplicationContext 创建 bean 对象。 代理设计模式 : Spring AOP 功能的实现。 单例设计模式 : Spring 中的 Bean 默认都是单例的。 模板方法模式 : Spring 中 jdbcTemplate 、 hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。 适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller 。 …… 1、简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数

JVM04-JVM中内存溢出以及其处理方法

与世无争的帅哥 提交于 2020-07-29 07:31:16
文章目录 前言 一些基本的设置说明 堆内存溢出 Java栈内存异常 方法区和运行时常量池溢出 总结 前言 上一篇我们介绍了 JVM03–JVM垃圾收集机制的一些基本概念 ,这一篇介绍一下JVM中各种内存溢出及其处理方法。 本文会按照JVM中内存划分来介绍各种内存溢出的例子。 一些基本的设置说明 为了模拟出内存溢出的效果,我们需要手动设置内存区域的内存大小,下面就是设置值部分设置值及其说明。 分类 选项 说明 虚拟机栈 -Xss 每个线程的栈大小 堆空间 -Xms 启动JVM时的初始堆大小 堆空间 -Xmx 堆空间最大值 新生代空间 -XX:NewRatio 新生代与老年代的比例 新生代空间 -XX:NewSize 新生代大小 新生代空间 -XX:SurvivorRation Eden区域SurvivorRation区的比例 永久代空间 -XX:PermSize 启动JVM时的初始永久代大小 永久代空间 -XX:MaxPermSize 永久代空间最大值 元空间 -XX:MetaspaceSize 指定元空间的初始空间大小,以字节为单位,达到该值就会触发垃圾收集进行类型卸载,同时收集器会对该值进行调整;如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过 -XX:MaxMetaspaceSize 的情况下,适当提高该值。 元空间 -XX