自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 收藏
  • 关注

原创 Spring-Aop源码解析(下)

结合源码可以得知,想要获取切面中的Advisor,首先他会把Spring单例池中所有的BeanName全部拿出来,然后挨个判断是否是切面Bean,如果是,那么根据这个BeanName构造一个MetadataAwareAspectInstanceFactory ,然后调用getAdvisor方法去获取切面中的Advisor,下面是getAdvisor中的核心源码。第一步,先找到所有的Advisor(包括Spring中的Advisor,以及Aspectj定义的那些注解)上面的代码总共分为两部分。

2024-04-20 18:58:53 1759

原创 Spring-Aop源码解析(中)

Advisor中可以自行的设置PointCut和Advice,在方法执行的时候(method.invoke())PointCut则会对被代理对象的类和方法进行匹配,如果匹配成功,那么就会将该Advisor打包成一个MethodInterceptor链(因为可能有很多增强逻辑,针对于同一个类或者方法),然后返回。Advice就是我们自己要实现的增强逻辑,所以这段代码翻译成中文就是,我要对UserService下的test方法,并且test方法中只有一个参数的这个方法进行前置逻辑的增强。

2024-04-16 23:45:52 930 1

原创 Spring-Aop源码解析(上)

在匹配对应的Advisor是否匹配当前正在执行的方法的时候,会先根据Class做匹配,观察类是否相等,然后对方法进行一个匹配,观察方法是否相等,第三道过滤必须将MethodMatcher中的Runtime属性设置成true,才会转换成InterceptorAndDynamicMethodMatcher,就是会进一步对方法中的参数进行一个额外的判断,观察参数是否也是匹配的。Aop:在原有功能不变的基础上, 进行功能增强,比如在方法发生异常/方法发生之前/之后进行额外逻辑的插入。

2024-04-16 00:28:14 542 1

原创 手写Spring整合mybatis

解决了以上两个问题,那么Mybatis就能顺利的整合到Spring中,解决思路如下,借助于Spring中的扫描器Scanner,自己定义扫描路径和规则,那么便能扫描到对应的Mapper接口,然后针对于这些接口生成代理对象(jdk动态代理),然后将动态代理生成的代理对象放到Spring的容器中,那么便是完成了Spring和mybatis的整合。1.Mybatis中的Mapper文件都是接口形式的,接口无法生成对象,该如何放到Spring的单例池中。手写Spring整合Mybatis的步骤如下。

2024-04-05 23:29:12 308 1

原创 SpringBoot启动服务源码解析

Import注解引入了四个类,我们先来看后面三个(Tomcat,Jetty,UnderTow),和Tomcat相关的内部类,就是定义了一个Bean,并且返回一个ServletWebServerFactory类型的对象,在中间的代码中我们可以自定义ConnectorCustomizers这些类,来设置启动的属性,比如,jetty和UnderTow也是一样的,这边拿Tomcat看一下;

2024-03-25 00:11:52 842 1

原创 Spring配置类源码解析(下)

1,2,3的处理逻辑比较简单,如果没有特殊情况下,就是直接根据ConfigClass生成BeanDefinition,然后注册到BeanDefinitionMap中,4的话开发者可以根据自身需要,在Spring启动的过程中自己生成对应的BeanDefinition。2.处理@Bean注解,上文的逻辑中在处理完@Import注解之后会去处理@Bean的逻辑,大致就是观察方法上是否有@Bean注解,如果有,那么将该方法缓存到BeanMethods中,到这里再去处理。

2024-03-16 23:13:26 832 1

原创 Spring配置类源码解析(上)

第一步是先判断是否实现了ImportSelector接口,如果实现了,那么强转在判断是否是延迟的ImportSelector,如果是,则缓存到list中,如果不是,那么立马执行对应的selectImports方法返回字串,然后根据字串生成对应的类,然后递归解析新生成的类中是否存在@Import。在其对应的解析器ConfigurationClassParser中,其parse方法下的doProcessConfigurationClass()方法就实现了主要的解析逻辑,可以挑选里面部分代码阅读其逻辑。

2024-03-16 00:22:53 1016 1

原创 redis分布式锁使用和源码解析

java对并发问题一般会采用上锁的方式来控制并发,可以用sychronized或者ReentrantLock或者cas的方式来上锁,但是在分布式系统下,这些方法就会失效,一般情况下会采用分布式锁的方式来对数据进行上锁(可以用redis,也可以用zk),下面是redis分布式锁的使用方式和源码解析。if:如果进入了,并且进入的还是自己的那个线程(锁重入),那么就会++,并且将时间重置为传进来的那个时间,返回null。if锁已经不存在了,那么通过channel发布抢占锁的消息,return 1;

2024-01-26 20:02:59 364 1

原创 Spring依赖注入源码解析

可以看出,上述的代码并没有在OrderService和MyService上加@Autowired或者@Resource等注解去注入,但是打印出的结果却不是null,而是有值的,Spring中对应的源码如下。1.@Bean注解中自带的属性@Bean(autowire = Autowire.BY_NAME/Autowire.BY_NAME)通常为Spring中的Bean的属性注入值的时候,会有以下两种方式。2.通过@Autowired/@Resource注解。

2024-01-21 20:18:42 259

原创 Spring整合Dubbo,@Reference注解源码解析

1.因为你在解析@Reference之前肯定会先解析@Service注解,然后肯定是先扔到自己的容器中然后再导出到注册中心,然后你在解析@Reference注解的时候就会判断到底你要引入的这个类是远程服务的还是本地服务的,如果是本地服务的(就是上面那个existsServiceBean(referencedBeanName)的判断,这样就不用走服务引入的逻辑,就会快很多)referenceBeanName:这个名字可以看到就是ReferenceBean的beanName,这个应该没啥异议,就是他的真名;

2024-01-18 00:09:35 1734 1

原创 Spring整合Dubbo,@Service注解源码解析

在@DubboComponentScan注解上导入了一个DubboComponentScanRegistrar类,该类实现了ImportBeanDefinitionRegistrar接口,因此会调用到其对应的registerBeanDefinitions方法,主要就是分成三步,第一步是对传入的路径进行扫描,得到一个个的BeanDefinition,第二步是扫描包路径下加了@Service注解的类并且加以相关的处理逻辑,第三步是处理加了@Reference注解的类;

2024-01-15 00:05:01 1751

原创 Spring整合Dubbo配置项源码解析

Dubbo实现了两个不同服务之间的通信,想要在Spring中使用和Dubbo相关的功能,无非就是将Dubbo实现的那些功能交给Spring去统一管理,在Spring的配置类上可以加上以下注解(@EnableDubbo)便可以在Spring中使用Dubbo,所以我们来解析一下这个注解到底干了些什么。@DubboComponentScan:开启扫描功能,去扫描@Service和@Reference注解,并将为这两个注解生成对应的Bean注入到Spring中供Spring统一调用分配;

2024-01-10 23:59:55 981

原创 Dubbo服务调用源码解析(服务端)

invoke方法中第一件事就是通过反射去执行被代理类的那个方法,比如客户端调用了服务端的sayHello方法,那么必须执行到这里才算是执行服务端的sayHello方法,然后将得到的结果包装成一个CompleteFuture,如果本身就是CompleteFuture,那么就原样返回,然后会等待执行完成,再将结果返回,然后又会回到CallbackRegistrationInvoker执行Filter过滤链逻辑。7.执行第二步接下来的逻辑,包装返回的结果容纳和通过channel.send发送结果。

2023-12-22 16:02:06 784

原创 Dubbo服务端各个Handler,filter,invoker的执行过程和作用

然后又会将handler放到一个dispatch里面,这个dispatch是跟dubbo里线程模型相关的东西,默认可以配置成all,代表着所有请求进来到这层都会封装成异步请求,也可以配置成direct,或者message,分别有他们的对应类,所以这边默认走的是AllDispatcher,那在这一层的话又封装了三个Handler,分别是AllChannelHandler,HeartbeatHandler,MultiMessageHandler。执行下一个Handler的receive方法。

2023-12-21 23:36:10 1052

原创 Dubbo服务导出源码解析

确定完providerUrl之后,便会遍历刚刚确定完的registryList,然后这里面会用ProxyFactory(动态代理,默认是用JavassistProxyFactory)生成一个Invoker,这个Invoker其实是一个执行器,里面包含了很多属性,比如要执行的方法,服务和注册中心的地址,可以看到是对ref(被代理对象)的一个代理增强,所以在执行Invoker.invoke()方法的时候实际上就是在执行被代理对象的那个方法。Dubbo服务导出字面意思就是,把生产者的服务,注册到注册中心。

2023-12-20 22:55:17 936 1

原创 Dubbo服务引入源码解析

当Spring启动过程中,会去给@Reference注解标注了的属性去进⾏赋值,赋值的对象为ReferenceBean中get()⽅法所返回的对象,这个对象是⼀个代理对象。用过Spring的都知道,可以通过@Autowired注解可以引入一个Spring容器中的Bean对象,但是这只是在单机服务环境下,在分布式架构中,又该如何引入另一个应用中的Bean对象。调用createProxy方法中,会先加载注册中心地址生成List,然后根据url中的协议调用其对应的refer方法(责任链模式)

2023-12-18 00:35:07 813 1

原创 Netty启动源码解析

通过追溯ServerBootstrap.bind(port)方法可以发现,在启动之初,便会调用1步骤中的反射生成Channel(就是服务端的ServerSocketChannel),并且会调用config().group().register(channel)方法将channel注册到config().group()->就是bossGroup中。可以看到runTask方法中的逻辑就是不断的从queue中拿出task然后执行,所以代码将回到步骤3加入的register0(promise)这个方法中。

2023-11-09 00:23:28 88 1

原创 Spring循环依赖及其三级缓存

如果的确需要生成代理对象,那么其实还会记录到另一个缓存(earlyProxyReferences)来表示该对象是进行过Aop了,后续不需要再执行额外的操作,所以在某种角度也可以称之为四级缓存。,该方法会最后去判断是否要进行Aop,会先找出所有的Advisor,然后根据Advisor的匹配规则(ClassFilter和MethodMatcher),先进进行类的匹配,然后再进行类下的方法匹配来判断是否需要对当前Bean进行动态代理。式,并保存到三级缓存中,这个lambda表达式。,如果当前Bean没有出。

2023-09-06 20:44:31 153 2

原创 Spring源码解析

通过isCandidateComponent方法走includeFilters和excludeFilters(黑名单)的判断,只有经过了这层筛选,然后才会生成ScannedGenericBeanDefinition(),然后会对BeanDefinition中的属性值做初始化设置,比如是否添加了@Primary注解,@Lazy注解,通过解析这些注解将其注入到该BeanDefinition对象所对应的属性值中,用于后续Bean生成;

2023-09-05 15:05:29 112

空空如也

空空如也

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

TA关注的人

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