cglib

spring源码解析---1.环境搭建

末鹿安然 提交于 2021-02-02 15:51:23
1.安装GitHub。下载地址:desktop.github.com。 2.安装Gradle。下载地址:gradle.org/releases/。 下载好,是个zip包,解压到目录,再配置下环境变量就可以用了。 新建GRADLE_HOME 在系统变量path里,加入对应的Gradle的系统变量 配置好,在系统cmd窗口输入命令“gradle -version”,如果安装成功则会显示gradle对应的系统版本。 1.3下载spring源码。下载地址:github.com/spring-projects/spring-framework 默认会显示master分支,我们切换到4.3.14版本,点击右边绿色的按钮Clone or download,弹出的div中选择Open in Desktop, 然后系统已经安装好的GitHub会弹出如下界面,我们选择好Local path,即源码下载的本地存放路径,选择好再点击clone按钮,进行下载源码操作。 1.3.1 解决GitHub国内下载慢的问题 访问https://www.ipaddress.com/websites/github.global.ssl.fastly.net#ipinfo 将图中显示的ip地址配置到host即可。 更改 C:\Windows\System32\drivers\etc\hosts 文件,在文件中追加 151

记一次使用 Lombok 翻车造成的事故!

僤鯓⒐⒋嵵緔 提交于 2021-02-02 11:59:41
来自:掘金,作者:liuxuzxx 链接:https://juejin.cn/post/6881432532332576781 序言 去年在项目当中引入了Lombok插件,着实解放了双手,代替了一些重复的简单工作(Getter,Setter,toString等方法的编写)。 但是,在使用的过程当中,也发现了一些坑,开始的时候并没有察觉到是Lombok的问题,后来跟踪了对应的其他组件的源码,才发现是Lombok的问题! Setter-Getter方法的坑 问题发现 我们在项目当中主要使用Lombok的Setter-Getter方法的注解,也就是组合注解@Data,但是在一次使用Mybatis插入数据的过程当中,出现了一个问题,问题描述如下: 我们有个实体类: @Data public class NMetaVerify{ private NMetaType nMetaType; private Long id; ....其他属性 } 当我们使用Mybatis插入数据的时候,发现,其他属性都能正常的插入,但是就是nMetaType属性在数据库一直是null. 解决 当我debug项目代码到调用Mybatis的插入SQL对应的方法的时候,我看到NMetaVerify对象的nMetaType属性还是有数据的,但是执行插入之后,数据库的nMetaType字段就是一直是null

Spring Boot实践——Spring AOP实现之动态代理

邮差的信 提交于 2021-02-01 06:53:56
Spring AOP 介绍   AOP的介绍可以查看 Spring Boot实践——AOP实现   与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改字节码,而是在内存中临时为方法生成一个AOP对象,这个AOP对象包含了目标对象的全部方法,并且在特定的切点做了增强处理,并回调原对象的方法。   Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是 InvocationHandler 接口和 Proxy 类。   如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,是利用asm开源包, 可以在运行时动态的生成某个类的子类 。注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为 final ,那么它是无法使用CGLIB做动态代理的。   这里有注意的几点如下: 从Spring 3.2以后不再将CGLIB放在项目的classpath下,而是将CGLIB类打包放在spring-core下面的org.springframework中

常用的JVM配置参数

喜欢而已 提交于 2021-01-22 10:36:34
一、Trace 跟踪参数   在Eclipse中,如何打开GC的监控日志     选择菜单栏Run -> Run Configurations -> Java Application -> 选择自己的项目 -> 在右侧找到Arguments选项卡 -> 在VM arguments中填写参数,具体参数在下面会有说明。     根据右侧Main的project和下面Main class确定自己监控的main方法     在右侧找到Arguments选项卡 -> 在VM arguments中填写参数 -verbose:gc(打开GC的跟踪日志) -XX:+printGC(打开GC的log的开关,简要日志)     上图为我自己的一个小项目中的gc简要的日志信息 其中 9865k 表示在堆中GC之前使用了9865k的空间,2891k 表示GC之后使用2891k的空间,剩空间为19456k ,本次GC使用的时间为0.0021802 secs -XX:+PrintGCDetails(打印GC的详细信息)     上图我们以第二条为例:PSYoungGen表示新生代 GC之前为9214k,GC之后为 1016K,新生代总大小为9216k,GC所使用的时间为0.0016505 secs。而后面的信息则为上面简要信息中的内容。user 总计本次 GC 总线程所占用的总 CPU 时间 ,sys –

老大,Service层需要接口吗?

别等时光非礼了梦想. 提交于 2021-01-21 19:12:08
前几天刷头条又刷到了「Service层和Dao层真的有必要每个类都加上接口吗? 」 这个问题,之前简单回答了一波,给出的观点是「看情况」 现在结合他参与的项目以及阅读的一些项目源码来看。如果 项目中使用了像Spring这样的依赖注入框架,那可以不用接口 ! 先来说说为什么使用了依赖注入框架以后,可以不使用接口! 不需要接口的理由 我整理了支持Service层和Dao层需要加上接口的理由,总结下来就这么三个: 可以在尚未实现具体Service逻辑的情况下编写上层代码,如Controller对Service的调用 Spring默认是基于动态代理实现AOP的,动态代理需要接口 可以对Service进行多实现 实际上,这三个理由都站不住脚! 先说说第一个理由:「上层可以在下层逻辑没有实现的情况下进行编码」!很典型的面向接口编程,对层与层之间进行了解耦,看起来好像没有问题。 这种开发方式适合不同模块之间是由不同的人或项目组开发的,因为沟通的成本比较大。同时避免由于项目组之间开发进度的差异而相互影响。 不过让我们回想一下,在一般项目开发里面,有多少项目组是按层来切分开发任务的呢?实际上,大部分的项目都是按照功能划分的。即使是现在前后端分离的情况,单纯的后端开发也是按照功能模块进行任务划分,即一个人负责从Controller层到DAO层的完整逻辑处理。在这种情况下,每一层都先定义一个接口

spring ApplicationContext中Bean的生命周期

女生的网名这么多〃 提交于 2021-01-21 04:17:19
AbstractApplicationContext Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh方法定义了spring容器在加载配置文件后的各项处理过程 public void refresh() throws BeansException, IllegalStateException { synchronized ( this .startupShutdownMonitor) { prepareRefresh(); // 初始化BeanFactory ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); prepareBeanFactory(beanFactory); try { postProcessBeanFactory(beanFactory); /** * 调用工厂后处理器: * 根据反射机制找出所有实现了BeanFactoryPostProcessor接口的Bean, * 并调用其postProcessBeanFactory()接口方法 */ invokeBeanFactoryPostProcessors(beanFactory); /** * 注册Bean后处理器: *

动态代理

五迷三道 提交于 2021-01-18 10:39:12
代理: 1.静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译。在程序运行前代理类的.class文件就已经存在了 2.动态代理:在程序运行时运用反射机制动态创建而成 JDK和CGLIB动态代理的差别: 1.JDK是基于java反射机制实现的,必须实现接口的业务才能生动态代理对象 2.cglib是基于ASM机制实现的,他会生成业务类的字类作为代理类 JDK代理的优点:最小依赖减少维护,代码简洁 cglib:无需实现接口,无侵入代码,性能高 来源: oschina 链接: https://my.oschina.net/wenhuayuan/blog/4910064

动态代理

拥有回忆 提交于 2021-01-15 02:18:11
原文链接 http://zhhll.icu/2020/11/12/java%E5%9F%BA%E7%A1%80/%E5%8F%8D%E5%B0%84/%E5%8A%A8%E6%80%81%E4%BB%A3%E7%90%86/ 动态代理 动态代理有很多种方式,如jdk代理,cglib,ASM等 在说动态代理之前先说一下静态代理 静态代理 静态代理在使用时,需要定义接口或者父类,被代理对象和代理对象一起实现相同的接口或者继承相同的父类 静态代理使用的是组合模式,在代理类中包含有被代理类的对象 public class TestStaticProxy { public static void main(String[] args) { NikeClothFactory nikeClothFactory = new NikeClothFactory(); ProxyFactory proxyFactory = new ProxyFactory(nikeClothFactory); proxyFactory.productCloth(); } } // 接口 interface ClothFactory{ void productCloth(); } // 被代理类 class NikeClothFactory implements ClothFactory{ @Override

JDK和CGLIB动态代理区别

徘徊边缘 提交于 2021-01-12 23:05:23
背景:虽然自己了解这两种代理的区别,但是面试时候还是答的很模糊,需要好好总结。 前言 JDK动态代理实现原理(jdk8): https://blog.csdn.net/yhl_jxy/article/details/80586785 CGLIB动态代理实现原理: https://blog.csdn.net/yhl_jxy/article/details/80633194 定义 JDK动态代理 利用拦截器(拦截器必须实现 InvocationHanlder)加上反射机制生成一个实现代理接口的匿名类 , 在调用具体方法前调用InvokeHandler来处理。 CGLiB动态代理 利用ASM开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理 。 实现CGLIB动态代理必须实现 MethodInterceptor (方法拦截器)接口 区别 jdk只能针对接口不能针对类实现代理。 CGLib通过继承方式实现代理。所以类或方法最好不要声明成final,对于final类或方法,是无法继承的。 Spring如何选择用JDK还是CGLiB? 1)当Bean实现接口时,Spring就会用JDK的动态代理。 2)当Bean没有实现接口时,Spring使用CGlib是实现。 3)可以强制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy

静态代理,jdk动态代理以及Cglib区别

我们两清 提交于 2021-01-12 19:58:01
众所周知,Spring AOP中涉及到了动态代理模式,那么有动态代理相应的就会有静态代理。那么动态代理分为哪几种,相对应的区别又是什么呢? 首先什么是代理? 找一个东西或者一个人去帮你做事,比如常说的中介就是一个代理,各大经销商的代理商等等。JAVA中的代理即是指将自己的事情委派给别人帮忙去完成。 静态代理:代理的是程序员已经创建好的类,也就是说当前仅有一个对象能被成功代理。上代码看下 首先是一个需要代理的接口类 该类描述了两个方法,一个是eat(),一个是run(); public interface UserAction { void eat(); void run(); } 接下来是该类的实现类,较为简单的实现方式,仅仅打印内容而已。 public class UserActionImpl implements UserAction { @Override public void eat() { System.out.println("吃饭"); } @Override public void run() { System.out.println("跑步"); } } 接口已经实现完成,剩下的即是代理对象了。上述的过程中静态代理和JDK的动态代理还没有区别。区别在于下面 public class UserActionStaticProxy implements