- 博客(12)
- 收藏
- 关注
原创 Spring中bean的生命周期
Spring中的bean的生命周期主要包含四个阶段:实例化Bean --> Bean属性填充 --> 初始化Bean -->销毁Bean首先是实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另一个尚末初始化的依赖时,容器就会调用doCreateBean()方法进行实例化,实际上就是通过反射的方式创建出一个bean对象Bean实例创建出来后,接着就是给这个Bean对象进行属性填充,也就是注入这个Bean依赖的其它bean对象属性填充完成后,进行...
2022-02-24 16:07:25 36923 3
原创 SpringAop名词解释
Aspect(切面)切面是跨越多个类的横切关注点,在Spring Aop中,切面是使用*@Aspect注解修饰的类,在Aspect中可以包含多个Pointcut以及相关的Advice*的定义Joinpoint(连接点)连接点指的是程序执行过程中的一个点,例如方法的执行或异常的处理;Joinpoint是所有可能被织入Advice(增强)的候选的点,在Spring Aop中,则可以认为所有方法执行点都是JoinpointAdvice(通知/增强)通知定义了将要织入到具体连接点(某个方法)的..
2022-02-24 15:20:01 484
原创 Spring中IOC的启动过程
prepareRefresh()设置容器启动时间设置一些状态位标识,如active、closed初始化占位符属性资源创建环境对象,校验必填属性是否可解析初始化一些成员变量,如earlyApplicationListeners(应用监听器)、earlyApplicationEvents(应用事件)容器刷新前的一些预处理工作obtainFreshBeanFactory()创建bean工厂,类型是DefaultListableBeanFactory设置bean工厂的序列化id..
2022-02-24 15:19:16 614
原创 乐观锁与悲观锁
乐观锁就是在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁;但是在更新数据时会判断在此期间别的线程是否有更新过这个数据大体流程两个线程,如线程A、B直接获取同步数据,不会加锁,执行各自的操作线程A、B在更新同步资源之前,都会判断资源是否被其他线程修改如果同步资源没有被其他线程修改,那么直接更新内存中同步资源的值如果同步资源被其他线程修改, 那么根据需要执行不同的操作,直接报错或者重试实现CAS实现例如Java中java.util.concurrent.atom
2022-02-23 19:03:01 155
原创 线程池的执行流程
线程池七大参数核心线程数最大线程数线程空闲时间时间空闲单位阻塞队列线程工厂拒绝策略具体流程提交任务到线程池判断核心线程数是否已满已满未满创建一个新的线程去执行提交的任务判断阻塞队列是否已满已满未满将任务存入任务队列中,等待执行判断最大线程数是否已满已满未满创建一个非核心线程来执行任务如果最大线程数已经满了,那么将会根据配置的拒绝策略来处理未执行的任务...
2022-02-23 19:01:59 451
原创 CAS算法
概述CAS的全程是:Compare And Swap(比较并交换),CAS是实现并发计算时常用到的技术,Java并发包中的很多类都使用了CAS技术,如ConcurrentHashMap,AtomicInteger原子操作等CAS操作涉及到3个操作符:当前内存中的值、预估值、即将修改的新增,当且仅当预估值等于内存中的值的时候,才将新的值保存到内存中,否则什么都不做作用CAS可以将比较和交换转换为原子操作,这个原子操作直接由CPU保证,CAS可以保证共享变量赋值时的原子操作特点CAS是一种非阻塞
2022-02-23 19:01:23 7469 1
原创 Spring中BeanFactory与ApplicationContext的区别
1.转载bean的方式不同BeanFactory在启动IOC容器的时候不会去实例化Bean,只有在使用到某个Bean时(即调用getBean()方法获取时),才对该Bean进行加载实例化(延迟实例化)优点因为容器启动的时候不会实例化Bean,所以应用启动的时候占用的资源较少,程序启动较快,适合对资源要求较高的应用缺点系统运行的速度相对于来说慢一些,并且有可能会出现空指针异常的情况不能提前发现一些存在的Spring的配置问题,如果Bean的某一个属性没有注入,当BeanFacory
2022-02-23 18:57:34 283
原创 Runnable与Callable区别
1.接口实现的方法不同Runnable需要实现run()方法Callable需要实现call()方法2.返回值不同Runnablerun()方法不允许指定返回值CallableCall()方法允许指定返回值,返回值是一个泛型,可以通过futureRask.get()方法来获取到线程执行的结果,但是此方法会阻塞主线程的执行,知道子线程任务执行完成并返回结果3.异常处理Runnablerun()方法不能抛出异常Callablecall()方法允许抛
2022-02-23 01:03:24 350
原创 redis数据结构以及使用场景
1.String数据最大是512MB使用场景计数器功能,可以使用incr命令实现自增操作,来计数(统计文章的阅读量,粉丝数量)系统中的一些配置值,Token令牌信息等session共享,在分布式系统中,由于有多台服务器,请求分发每次分发到不同的目标服务器可能都不一样,这时候就需要利用中间件来保存session的状态,我们可以把session保存到redis中限流,需要对某些用户、某些接口、某些ip进行限流2.List字符串列表,按照插入顺序排序使用场景消息队列,可以
2022-02-23 01:02:53 103
原创 Java创建线程的方式有哪些
1.通过继承Thread类创建定义Thread的子类,重写run()方法创建子类的实例=》创建线程对象调用线程对象的start()方法启动线程public class CreateByThread extends Thread{ @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(i); } }
2022-02-23 01:02:21 279
原创 BeanFactoryPostProcessor与BeanPostProcessor的区别
1.作用不同BeanFacotoryPostProcessor允许我们在实例化bean之前(在调用bean的构造函数创建对象之前执行)拿到bean定义信息,然后修改它,比如可以修改bean的属性值,或者往容器中注入一些其他的bean定义信息BeanPostProcessor允许我们在bean初始化之前、或者初始化之后,修改bean实例信息,比如生成bean的动态代理对象2.接口方法不同BeanFacotoryPostProcessorpublic interface Bean
2022-02-23 01:01:30 922
原创 Java线程池七大参数含义
corePoolSize线程池中的常驻线程数量,固定线程数maximumPoolSize线程池中能够容纳的同时执行的最大线程数keepAliveTime多余的空闲线程的存活时间;当线程池中的数量超过corePoolSize(固定线程数)时,并且当其空闲时间达到keepAliveTime时,多余的线程就会被销毁掉,知道只剩下corePoolSize个线程为止TimeUnitkeepAliveTime的单位BlockingQueue任务队列,被提交但还没有执行的任务就会被存到任务队列中
2022-02-23 00:59:39 380
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人