Spring
头发阻挡了我对知识的吸收
还没秃的小菜鸡
头发阻挡了我对知识的吸收
展开
-
Spring源码解析——Spring中事务的工作原理
Spring事务的基本使用注解方式开启注解支持在xml中开启注解方式支持 <!-- 开启注解方式的事务配置支持-- <tx:annotation-driven transaction-manager="txManager"/>或在java代码中以注解的方式(@EnableTransactionManagement)开启注解方式支持使用在要加事务管理的类或方法上加@Transactional注解属性说明public @interface Transact原创 2020-11-21 22:28:43 · 370 阅读 · 0 评论 -
Spring源码解析——AOP
在Bean的初始化化后会执行Bean的后置处理器方法applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException { Object result = existingBean; for (Be原创 2020-11-12 08:27:22 · 123 阅读 · 0 评论 -
Spring源码解析——循环依赖
什么是循环依赖?很简单,就是A对象依赖了B对象,B对象依赖了A对象。比如:// A依赖了Bclass A{ public B b;}// B依赖了Aclass B{ public A a;}那么循环依赖是个问题吗?如果不考虑Spring,循环依赖并不是问题,因为对象之间相互依赖是很正常的事情。比如:A a = new A();B b = new B();a.b = b;b.a = a;这样,A,B就依赖上了。但是,在Spring中循环依赖就是一个问题了,为什么?因原创 2020-11-11 10:00:08 · 137 阅读 · 0 评论 -
Spring源码解析——Spring整合Mybatis
1.3.2版本通过@MapperScan导入了MapperScannerRegistrar类@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(MapperScannerRegistrar.class)public @interface MapperScan {}MapperScannerRegistrar类实现了ImportBeanDefinitionRegistrar接口,所原创 2020-11-05 14:44:16 · 127 阅读 · 0 评论 -
Spring源码解析——推断构造方法的底层原理分析
概述Spring中的一个bean,需要实例化得到一个对象,而实例化就需要用到构造方法。一般情况下,一个类只有一个构造方法:要么是无参的构造方法要么是有参的构造方法如果只有一个无参的构造方法,那么实例化就只能使用这个构造方法了。如果只有一个有参的构造方法,那么实例化时能使用这个构造方法吗?要分情况讨论:使用AnnotationConfigApplicationContext,会使用这个构造方法进行实例化,那么Spring会根据构造方法的参数信息去寻找bean,然后传给构造方法使用Clas原创 2020-11-03 16:59:14 · 411 阅读 · 0 评论 -
Spring源码解析——解析配置类以及扫描源码解析
概述主要概述一下invokeBeanFactoryPostProcessors(beanFactory)方法,在BeanFactory准备好了之后,执行BeanFactoryPostProcessor,开始对BeanFactory进行处理,默认情况下:此时beanFactory的beanDefinitionMap中有6个BeanDefinition,5个基础BeanDefinition+AppConfig的BeanDefinition ,而这6个中只有一个BeanFactoryPostProcessor:原创 2020-10-30 17:42:42 · 200 阅读 · 0 评论 -
Spring源码解析——启动过程详解
基于Spring的启动看看Spring 进行了哪些操作,在前面简单写过,现在详细概述一次。AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); System.out.println(applicationContext.getBean("userService"));进入AnnotationConfigApplicationCo原创 2020-10-27 17:13:44 · 381 阅读 · 1 评论 -
Spring源码解析——Bean销毁的生命周期
使用首先我们先来回顾一下 Spring 初始化/销毁 Bean 几种方式,分别为:init-method/destroy-methodInitializingBean/DisposableBean@PostConstruct/@PreDestroyContextStartedEvent/ContextClosedEventinit-method/destroy-method这种方式在配置文件文件指定初始化/销毁方法。XML 配置如下<bean id="demoService" cl原创 2020-10-26 17:29:53 · 1000 阅读 · 0 评论 -
Spring源码解析——@Resource注解底层原理
@Resource注解,默认基于ByName注入模型实现的注入,来看看具体实现,入口在CommonAnnotationBeanPostProcessor的postProcessProperties先看看postProcessProperties方法public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) { //查询注入点 InjectionMetadata meta原创 2020-10-23 17:26:47 · 1766 阅读 · 2 评论 -
Spring源码解析——依赖注入(二)
前面说到Spring 通过bytype注入,留下了一些没有诉说,现在来详细看看protected void autowireByType( String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) { TypeConverter converter = getCustomTypeConverter(); if (converter == null) { convert原创 2020-10-22 09:28:03 · 249 阅读 · 1 评论 -
Spring源码解析——依赖注入(一)
概述手动注入set方法构造方法自动注入XML的autowire自动注入@Autowired注解的自动注入(只是一个注解,基于byType注册模式实现,算不上真正的自动注入)XML的注入方式xml的注入方式在最早的时候用的最多的,xml的注入分为手动模式和自动模式,我们先来看下手动的模式,手动模式要在xml文件中写标签来手动注入<bean name="orderService" class="com.zy.service.OrderService"></bean原创 2020-10-21 09:35:44 · 275 阅读 · 0 评论 -
Spring源码解析——Bean的生命周期
如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法;推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean;spring处理合并后的beanDefinition(合并?是spring当中非常重要的一块内容,后面的文章我会分析);判断..原创 2020-10-19 16:24:36 · 173 阅读 · 0 评论 -
Spring源码解析——初始化解析
前言1:实例化一个ApplicationContext的对象;2:调用bean工厂后置处理器完成扫描;3:循环解析扫描出来的类信息;4:实例化一个BeanDefinition对象来存储解析出来的信息;5:把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来,以便后面实例化bean;6:再次调用bean工厂后置处理器;7:当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等等,如果我们只关心如何实例化一个bean原创 2020-10-16 17:52:21 · 137 阅读 · 0 评论 -
容器的扩展点(FactoryBean)
概述FactoryBean主要用来定制化Bean的创建逻辑当我们实例化一个Bean的逻辑很复杂的时候,使用FactoryBean是很必要的,这样可以规避我们去使用冗长的XML配置FactoryBean接口提供了以下三个方法:Object getObject(): 返回这个FactoryBean所创建的对象。boolean isSingleton(): 返回FactoryBean所创建的对象是否为单例,默认返回true。Class getObjectType(): 返回这个FactoryBe原创 2020-10-14 22:13:16 · 198 阅读 · 0 评论 -
BeanDefinition(二)
什么是合并?一个BeanDefinition包含了很多的配置信息,包括构造参数,setter方法的参数还有容器特定的一些配置信息,比如初始化方法,静态工厂方法等等。一个子的BeanDefinition可以从它的父BeanDefinition继承配置信息,不仅如此,还可以覆盖其中的一些值或者添加一些自己需要的属性。使用BeanDefinition的父子定义可以减少很多的重复属性的设置,父BeanDefinition可以作为BeanDefinition定义的模板。我们通过一个例子来观察下合并发生了什么,编写原创 2020-10-14 20:50:59 · 126 阅读 · 0 评论 -
BeanDefinition(一)
BeanDefinition——spring bean的建模对象,那么什么是spring bean的建模对象呢?一言概之就是把一个bean实例化出来的模型对象?有人会问把一个bean实例化出来有Class就行了啊,Class也就是我们通常说的类对象,就是一个普通对象的建模对象,那么为什么spring不能用Class来建立bean呢?很简单,因为Class无法完成bean的抽象,比如bean的作用域,bean的注入模型,bean是否是懒加载等等信息,Class是无法抽象出来的,故而需要一个BeanDefini转载 2020-10-14 17:16:53 · 248 阅读 · 0 评论 -
Spring中核心概念(粗看)
BeanDefinition定义一个bean的方式:声明式:< bean/>,@Bean,@Component编程式:BeanDefinitionBuilder// 定义了一个BeanDefinitionAbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();// 当前Bean对象的类型beanDefinition.setB原创 2020-10-12 16:49:53 · 118 阅读 · 0 评论 -
gradle安装
下载gradle,可以去官网下载,gradle版本需要4.2以上,小编这里选择的是gradle4.9版本。 gradle下载地址:https://services.gradle.org/distributions/gradle下载时候有三个包,gradle-src为gralde源码,gradle-bin为安装包,gradle-all为源码加安装包,我们这里只需下载安装文件即可。配置gradlegradle下载后不需要安装,解压再本地磁盘后配置环境变量即可新建GRADLE_HOME,path转载 2020-10-12 10:08:12 · 300 阅读 · 0 评论