cglib

了解一下Spring中用了哪些设计模式?这样回答面试官才稳

瘦欲@ 提交于 2021-01-09 10:47:14
一:简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。 二:工厂方法模式 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式,即应用程序将对象的创建及初始化职责交给工厂对象。 一般情况下,应用程序有自己的工厂对象来创建bean.如果将应用程序自己的工厂对象交给Spring管理,那么Spring管理的就不是普通的bean,而是工厂Bean。 就以工厂方法中的静态方法为例讲解一下: 建一个config.xm配置文件,将其纳入Spring容器来管理,需要通过factory-method指定静态方法名称: 三:单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。spring中的单例模式完成了后半句话,即提供了全局的访问点BeanFactory。但没有从构造器级别去控制单例,这是因为spring管理的是是任意的java对象。 核心提示点

Spring中用了哪些设计模式

…衆ロ難τιáo~ 提交于 2021-01-09 05:07:00
1 简单工厂模式 又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一。 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。 spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。如下配置,就是在 HelloItxxz 类中创建一个 itxxzBean。 <beans> <bean id="singletonBean" class="com.itxxz.HelloItxxz"> <constructor-arg> <value>Hello! 这是singletonBean</value> </constructor-arg> </ bean> <bean id="itxxzBean" class="com.itxxz.HelloItxxz" singleton="false"> <constructor-arg> <value>Hello! 这是itxxzBean! </value> </constructor-arg> </bean> </beans> 2 工厂方法模式 通常由应用程序直接使用new创建新的对象,为了将对象的创建和使用相分离,采用工厂模式

SpringBoot系列(1)——AOP-入门

↘锁芯ラ 提交于 2020-12-31 08:17:28
摘要 aop关键词 spring aop小demo <!--more--> 概念 使用场景:与业务无关的且经常使用到的公共功能如鉴权,日志,性能优化,事务,错误处理,资源池,同步,审计,幂等等 优点:降低耦合度,易扩展,高复用 实现方式:静态代理(AspectJ) + 动态代理(CGlib/Jdk) aop关键词 连接点(Joinpoint) 连接点就是增强的实现 **切点(PointCut)**就是那些需要应用切面的方法 增强(Advice) 前置通知(before) 后置通知(after) 异常通知(afterThrowing) 返回通知(afterReturning) 环绕通知(around) 目标对象(Target) **织入(Weaving)**添加到对目标类具体连接点上的过程。 代理类(Proxy) 一个类被AOP织入增强后,就产生了一个代理类。 切面(Aspect) 切面由切点和增强组成,它既包括了横切逻辑的定义,也包括了连接点的定义 Spring aop测试 pom <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.5.RELEASE</version> <relativePath/

【奇淫巧技】Java动态代理(JDK和cglib)

时光怂恿深爱的人放手 提交于 2020-12-30 14:29:17
JAVA的动态代理 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。 按照代理的创建时期,代理类可以分为两种。 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。 动态代理:在程序运行时,运用反射机制动态创建而成。 首先看一下静态代理: 1、Count.java package net.battier.dao; /** * 定义一个账户接口 * * @author Administrator * */ public interface Count { // 查看账户方法 public void queryCount(); // 修改账户方法 public void updateCount(); } 2、CountImpl.java package net.battier.dao.impl; import net.battier.dao.Count; /** * 委托类(包含业务逻辑) * * @author Administrator *

Spring注解驱动开发之AOP

穿精又带淫゛_ 提交于 2020-12-29 20:03:44
  前言:现今SpringBoot、SpringCloud技术非常火热,作为Spring之上的框架,他们大量使用到了Spring的一些底层注解、原理,比如@Conditional、@Import、@EnableXXX等。如果掌握这些底层原理、注解,那么我们对这些高层框架就能做到高度定制,使用的游刃有余   本篇主要内容:Spring AOP的使用及其原理分析 一、AOP功能测试 AOP【动态代理】:指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式 步骤:    1、导入aop模块;Spring AOP:(spring-aspects)   2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)    public class MathCalculator { public int div(int i,int j){ System.out.println("MathCalculator...div..."); return i/j; } }   3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行; / 切面类 @author lfy @Aspect: 告诉Spring当前类是一个切面类 /

Spring注解驱动开发之十四——AOP原理分析(二)Annotation...AutoProxyCreator 实现时机

筅森魡賤 提交于 2020-12-29 19:11:36
本文包含以下内容: postProcessBeforeInstantiation 执行时机 postProcessBeforeInstantiation 的具体作用 目标方法div执行流程一:获取拦截器链 目标方法div执行流程二: 拦截器链的调用流程分析 AOP 总结 前文回顾: 《 Spring注解驱动开发之十三——AOP原理分析(一)@EnableAspectJAutoProxy注解干了什么 》 上文说到,通过 @EnableAspectJAutoProxy 注解,将通过注册器往Spring中注册一个 AnnotationAwareAspectJAutoProxyCreator 实例化对象,并且讨论了AnnotationAwareAspectJAutoProxyCreator 的继承关系。 本文将紧接上文,进行断点调试在 registerBeanPostProcessors 函数之后讨论, AnnotationAwareAspectJAutoProxyCreator 实例化组件如何实现AOP 的功能。 1.postProcessBeforeInstantiation 执行时机 在 postProcessBeforeInstantiation 函数添加断点,查看执行时机 调用栈如图所示: 1)<init>:84,

JVM-各内存区域抛出OutOfMemoryError异常分析

旧时模样 提交于 2020-12-29 17:49:03
OutOfMemoryError异常 注:本人测试基于jdk1.8测试,有部分不同但是原理可以了解,感兴趣可以下载jdk1.7配套测试 Java虚拟机规范中描述,除了程序计数器,虚拟机的其他几个运行时区域都有发生OOM异常的可能。 下面的示例代码都基于HotSpot虚拟机运行,设置VM参数可以在IDE的VM options内设置,如图 Java堆溢出 引发思路:Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。 以下代码需要配置VM,设置java堆大小20MB,不可扩展(将堆的最小值-Xms参数与最大值-Xmx参数设置为一样即可避免堆自动扩展),-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出异常时Dump出当前的内存堆转储快照以便事后进行分析 -Xmx:最大堆大小 -Xmx20M -Xms20M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=E:\jvmlog\oom.hprof 可以指定hprof文件存放位置,之后使用jdk自带工具jvisualvm.exe打开分析即可 import java.util.ArrayList; import java.util

面试官问我:什么是静态代理?什么是动态代理?注解、反射你会吗?

半城伤御伤魂 提交于 2020-12-29 00:51:39
听说微信搜索《Java鱼仔》会变更强哦! 本文收录于 JavaStarter ,里面有我完整的Java系列文章,学习或面试都可以看看哦 开场 一位穿着蓝色衬衫,牛仔裤,拿着一个白色保温杯的中年男子急匆匆地坐在你对面,看样子是项目上的东西很急,估摸面试时间不会太长,这样一想心情放松了许多......(后来我就被打脸了) ​ 面试开始 面试官:小伙子,我看你的简历上说精通java基础对吧,那我先简单来问几个java基础。 好的好的,面试官你问。(一听到简单两个字就内心窃喜......) 面试官:你知道Java中有个东西叫代理吗? 知道知道,代理就是 通过代理对象去访问实际的目标对象 ,比如我们在生活中租房,可以直接找房东,也可以通过某些租房平台去租房,通过租房平台的这种方式就是代理。在java中这种租房平台就被叫做代理类,代理类不仅能实现目标对象,还能增加一些额外的功能。据我所知java中的代理方式有静态代理和动态代理。(这个时候面试官很大概率会问你这两种代理模式)。 面试官:没想到你还能通过生活中的现象去理解代码,不错不错,我看你提到了静态代理和动态代理,那你给我说说什么是静态代理吧 (果然问了,还好我做了准备)静态代理就是在代码运行之前,这个代理类就已经存在了。还是以上面的租房为例,在代码中会首先创建一个通用的租房接口: public interface Room { void

spring cglib实现嵌套方法拦截

冷暖自知 提交于 2020-12-17 06:27:01
使用spring 的拦截器对方法进行拦截,不管是动态代理,还是cglib, 只能拦截到被代理对象的调用方法,对于被调用方法里再调用同一对象里的其他方法就无法拦截到,就是我们说的嵌套拦截,之前文章里提及过加载器改写实现拦截(美团cat方式) , 今天试验出另外一种方法 我们要在spring初始化对象后对其用cglib加强修改,重新注入到容器当中 刚开始想在容器初始化完毕后修改bean, 利用实现ApplicationListener接口 public class InstantiationTracingBeanPostProcessor implements ApplicationListener<ContextRefreshedEvent> { @Override public void onApplicationEvent(ContextRefreshedEvent event) { //cglib 改写 } } 参考了另外一篇文章 https://www.cnblogs.com/007sx/p/5785914.html 在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查。 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出哪个文件的xml文件使用了这个函数。

Spring事务的那些坑,这里都给你总结好了!

半世苍凉 提交于 2020-12-16 10:27:04
点击上方“ java大数据修炼之道 ” , 选择“ 设为星标 ” 优质文章和精品资源, 第一时间送达 关注公众号后台回复 资源 获取实战教学资料+视频 哈喽,各位新来的小伙伴们,大家好!由于公众号做了改版,为了保证公众号的资源能准时推送到你手里,大家记得将咱们的公众号 加星标置顶 ,在此真诚的表示感谢 作者:蚊子squirrel www.jianshu.com/p/a4229aa79ace Spring框架已是JAVA项目的标配,其中Spring事务管理也是最常用的一个功能,但如果不了解其实现原理,使用姿势不对,一不小心就可能掉坑里。 为了更透彻的说明这些坑,本文分四部分展开阐述:第一部分简单介绍下Spring事务集成的几种方式;第二部分结合Spring源代码说明Spring事务的实现原理;第三部分通过实际测试代码介绍关于Spring事务的坑;第四部分是对本文的总结。 一、Spring事务管理的几种方式: Spring事务在具体使用方式上可分为两大类: 1. 声明式 基于 TransactionProxyFactoryBean的声明式事务管理 基于 <tx> 和 <aop> 命名空间的事务管理 基于 @Transactional 的声明式事务管理 2. 编程式 基于事务管理器API 的编程式事务管理 基于TransactionTemplate 的编程式事务管理