自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 问答 (2)
  • 收藏
  • 关注

原创 SpringMVC执行流程及组件

一个请求匹配前端控制器DispatcherServlet的请求映射路径(在web.xml中指定), WEB 容器将该请求转交给 DispatcherServlet 处理 DispatcherServlet 接收到请求后, 将根据请求信息交给处理器映射器(HandlerMapping) HandlerMapping根据用户的url请求查找匹配该url的Handler,并返回一个执行链 DispatcherServlet 再请求 处理器适配器(Ha...

2021-04-25 10:38:55 89

原创 Springboot,Spring,SpringMvc的区别

spring boot就是一个大框架里面包含了许许多多的东西,其中spring就是最核心的内容之一,当然就包含spring mvc。spring mvc 是只是spring 处理web层请求的一个模块。因此他们的关系大概就是这样:spring mvc < spring <springboot。spring boot 就是把 spring spring mvc spring data jpa 等等的一些常用的常用的基础框架组合起来,提供默认的配置,然后提供可插拔的设计,..

2021-04-25 10:30:22 371

原创 Spring事务传播机制

多个事务方法相互调用时,事务如何在这些方法之间传播方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体操作造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响是什么就由两个方法所定义的事务传播类型所决定。REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务。SUPPORTS:当前存在事务,则加入当前事务,如果当前没事务,则以非事务方法执行。MAN

2021-04-25 10:18:13 89

原创 Spring事务什么时候会失效

Spring事务的原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了!常见情况有如下几种:发生自调用,类里面使用this调用本类的方法(this通常忽略),此时这个this对象不是代理类,而是UserService对象本身!解决办法:让this变成UserService的代理类即可。 方法不是public的,@Transactional只能用于public的方法上,否则事务不生效,如果要在非public方法上,可以开启ApsjectJ代理模式。 数据库不支持事务。 没有被S

2021-04-25 10:18:00 134

原创 什么是bean的自动装配,有哪些方式

开启自动装配,只需要在xml配置文件<bean>定义“autowire”属性<bean id="cutomer" class="com.xxx.xxx.Customer" autowire="">autowire属性有五种装配的方式:no-缺省情况下,自动配置是通过“ref”属性手动设定手动装配:以value或ref的方式明确指定属性值都是手动装配,需要通过“ref”属性来连接beanbyName:根据bean的属性名称进行自动装配Customer的属性名称

2021-04-25 10:17:46 1381

原创 Spring事务实现方式和原理以及隔离级别

在使用Spring框架时,可以有2种使用事务的方式,一种是编程式,一种是声明式,@Transactional注解就是声明式。首先,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行了扩展,以及提供了一些能让程序员更加方便操作事务的方式。比如我们可以通过在某个方法上增加@Transactional注解,就可开启事务,这个方法中所有的sql都会在一个事务中执行,统一成功或失败。在一个方法上加了@Transactional注解后,Spring会基于这个类生成一个代理对象,会将这个代理对

2021-04-25 10:17:33 390

原创 Spring框架中的单例Bean是线程安全的吗

Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理。如果Bean是有状态的,那么就需要开发人员自己来进行线程安全的保证,最简单的办法就是改变bean的作用域,把singleton改为property,这样每次请求Bean就相当于是new Bean(),这样就可以保证线程安全了。有状态就是有数据存储功能 无状态就是不会保存数据,controller,service和dao本身不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,

2021-04-25 10:17:12 315

原创 简述Spring Bean的生命周期

解析类得到BeanDefintion 如果有多个构造方法,则要判断构造方法 确定构造方法后,进行实例化得到一个对象 对对象中的加了@Autowired注解的属性进行属性填充 回调Aware方法,比如BeanNameAware,BeanFactoryAware 调用BeanPostProcessor的初始化前方法 调用初始化方法 调用BeanPostProcessor的初始化后方法,在这里会进行AOP 如果当前创建的Bean是单例的,则会把Bean放入单例池 使用bean Spring容.

2021-04-25 10:16:06 181

原创 谈谈你对IOC的理解

容器概念,控制反转,依赖注入IOC容器:实际上就是map,里面存的是各种对象(在XML里配置的bean节点,@respository,@service,@controller,@component),在项目启动的时候会读取配置文件里面的bean节点,根据全限定类名使用反射创建对象放到map里,扫描到打上上述注解的类还是通过反射的方式创建对象放到map里面。这个时候map里面就有各种对象了,接下来我们再代码里面需要用到里面的对象时,再通过DI注入(@Autowired,@Resources,@Qual

2021-04-24 17:41:42 574

原创 线程池中线程复用原理

线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过Thread创建线程的一个线程必须对应一个任务的限制。在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread进行封装,并不是每次执行任务都会调用Thread.start()创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不断检查是否有任务需要被执行,如果有则直接执行,也就是调用任务中的run方法,将run方法当成一个普通的方法执行,通过这种方式只使用固定的线程就将所有的任务的r

2021-04-24 17:12:57 86

原创 线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程。

一般的队列只能保证作为一个有限长度的缓冲区,如果超过了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入列的任务。阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源阻塞队列自带阻塞和唤醒功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活,不至于一致占用cpu资源。...

2021-04-24 17:08:22 1193

原创 简述线程池的处理流程

2021-04-24 17:03:14 221

原创 线程的生命周期?线程有几种状态

1.线程通常有5种状态:创建,就绪,执行,阻塞,死亡。2.阻塞又分为3种情况:等待阻塞:运行的线程执行wait方法,该线程释放占有的所有资源,JVM会把该线程放入等待池中。进入这个状态后,是不能自动唤醒的。必须依靠其他线程调用notify()或者notifyall()才能被唤醒,wait是object类的方法 同步阻塞:运行的线程获取对象的同步锁时,若该同步锁被别的线程占有,则JVM会把该线程放入锁池中。 其他阻塞:运行的线程执行sleep或者join方法,或者发出了I/O请求时,JVM会把该线

2021-04-24 16:59:24 116 1

原创 sleep(),wait(),join(),yield()区别

1.锁池当所有需要竞争同步锁的线程都会放在锁池中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池中进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进行就绪对烈烈进行等待cpu资源分配。2.等待池当我们调用wait()方法后,线程会放到等待池中,等待池的线程是不会去竞争同步锁。只有调用了notify()或者notifyAll()后等待池的线程才会去竞争锁,notify()是随机从等待池中选出一个线程放到锁池,而notifyAll()是将等待池中所有线

2021-04-24 16:49:47 403

原创 双亲委派模型

2021-04-24 16:36:10 76

原创 Java类加载器有哪些

JDK自带三个类加载器:BootstrapClassLoader、ExtClassLoader、AppClassLoader。BootstrapClassLoader:是ExtClassLoader的父类加载器,默认负责加在%JAVA_HOME%lib下的jar包和class文件。ExtClassLoader:是AppClassLoader的父类加载器,负责加在%JAVA_HOME%lib/ext文件夹下的jar包和class文件。AppClassLoader:是自定义类加载器的父类,负责加载c

2021-04-24 16:13:34 220

原创 ThreadLocal内存泄漏原因,如何避免

内存泄漏为程序在申请内存后,无法释放已经申请的内存空间,一次内存泄漏危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早都会被占光。不再会被使用的对象或者变量占用的内存不能被回收,就是内存泄漏。强引用:使用最普遍的引用(new),一个对象具有强引用,不会被垃圾回收器回收。当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序中止,也不会回收这种对象弱引用:JVM进行垃圾回收时,无论内存空间是否充足,都会回收被弱引用关联的对象。在java中,用java.lang

2021-04-24 16:07:54 164

原创 ConcurrentHashMap原理,jdk7和jdk8版本的区别

jdk7:数据结构:ReentrantLock+Segment+HashEntry,一个Segment中包含了一个HashEntry数组,每个HashEntry又是一个链表结构。元素查询:二次hash,第一次hash定位到Segment,第二次hash定位元素所在链表的头部锁:Segment分段锁,Segment继承了ReentrantLock,锁定操作的Segment,其他Segment不受影响,并发度为Segment的个数,可以通过构造函数指定,数组扩容不影响其他Segmentget方法

2021-04-15 17:59:36 654 1

原创 HashMap和Hashtable的区别及底层实现

区别:HashMap方法没有synchronized修饰,非线程安全,Hashtable是线程安全的 HashMap允许key和value为null,而Hashtable不允许底层实现:数组+链表。(下标冲突后创建链表存储元素)jdk8开始链表高度到8,数组长度超过64,链表转变为红黑树,元素以内部类Node节点存在计算key的hash值,二次hash然后对数组长度进行取模,对应数组下标 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组 如果产生hash冲突,先.

2021-04-15 17:37:06 201

原创 ArrayList和LInkedList的区别

ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问)。扩容机制:因为数组是长度固定,超出长度数据时需要新建数组,然后将老数组拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,然后插入新元素),使用尾部插入法并指定初始容量可以极大提高性能。LinkedList:基于链表,可以存储在分散的内存中(内部是Node对象),适合数据插入及删除操作,不适合做查询,需要逐一遍历。遍历LinkedList必须使用Iterator不能使用for循环,因为每次for循环体内通过get

2021-04-14 11:35:12 41

原创 hashCode和equals

hashCode介绍hashCode()的作用是获取哈希码,也称散列码,返回的是一个int的整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在Object类中,java中任何类都含有hashCode()函数。散列表存储的是键值对。它的特点是:能根据“键”快速检索出对应的“值”。这其中就利用了散列码。为什么要有hashCode以HashSet为例介绍为什么要有hashCode对象存入HashSet时,HashSet会先计算对象的hashCode值来判断应该存入哪

2021-03-23 13:23:04 106

原创 List和Set的区别

List:有序,按对象进入的顺序保存对象, 可重复,允许有多个null值存在,可以用iterator取出所有元素,然后逐一遍历。也可以通过get(int index)获取指定下标元素 Set:无序,不可重复,最多允许一个null存在,取元素时只能iterator取出所有元素,然后逐一遍历。...

2021-03-23 13:13:21 56

原创 ==和equlas的区别

==比较的栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址equals:object中默认也是采用==比较,通常会被重写object:public boolean equals(Object obj) { return (this == obj); }String public boolean equals(Object anObject) { if (this == anObject) { return t

2021-03-23 13:09:48 41

原创 抽象类和接口的区别

抽象类和接口的区别1.抽象类可以存在普通成员函数,而接口中只能存在public abstract方法。2.抽象类中成员变量可以是任意类型,而接口的成员变量都是public static final类型3.抽象类是单继承,接口是可以多实现接口设计的目,是对类的行为进行约束(更准确的说是一种“有”约束,因为接口不能规定类不可以有什么行为),也就是提供一种机制,可以强制要求不同的类具有相同的行为。他只约束了行为的有无,但不对如何实现行为进行限制。抽象类设计目的,是代码复用。当不同的类具有某些相

2021-03-23 11:45:18 48

原创 BeanFactory和FactoryBean的区别

BeanFactory(接口)这个其实是所有Spring Bean的容器根接口,给Spring 的容器定义一套规范,给IOC容器提供了一套完整的规范,比如我们常用到的getBean方法等定义方法:getBean(String name): Spring容器中获取对应Bean对象的方法,如存在,则返回该对象 containsBean(String name):Spring容器中是否存在该对象 isSingleton(String name):通过beanName是否为单例对象 isProto

2021-03-22 09:59:01 470

转载 让面试官目瞪口呆的DCL单例

首先我们先写一个双重检查锁(DCL)的单例public class Singleton_05 { private volatile static Singleton_05 instance; public static Singleton_05 getInstance(){ if(null==instance){ synchronized (Singleton_05.class){ if(null==instan

2020-11-20 14:46:54 67

原创 Java异常简单解释

基本描述异常体系的根类是:ThrowableThrowable:|--Error:重大的问题,我们处理不了。也不需要编写代码处理。比如说内存溢出。|--Exception:一般性的错误,是需要我们对编写的代码进行处理。|--运行期异常:在运...

2019-06-17 23:08:13 387

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除