Spring源码解析
会coding的厨子
这个作者很懒,什么都没留下…
展开
-
SpringAOP的实现原理:3、SpringAOP代理完成之后是如何进行调用的?
正常情况下,每个Advisor里面都会包含PointCut和一个Advice:pointCut用来判断方法和类是否需要被增强,Advice用来给Bean做增强。调用步骤: 1、首先CGLib内部会根据方法获取对应的增强器 2、调用增强器的增强方法,对于MethodInterceptor的增强器,就会调用intercept方法。 2.1、intercept方法分析。我们分析对于自己写的@Aspect(@Around、@Before、@After 等)对于此拦截器,首先...原创 2020-06-01 13:45:30 · 429 阅读 · 0 评论 -
Spring循环依赖产生的原因以及解决方式
原因一、构造方法引起的循环依赖的错误@Componentpublic class Aest { private MathCalculator mathCalculator; @Autowired public Aest(MathCalculator mathCalculator){ this.mathCalculator=mathCalculator; }}@Componentpublic class MathCalculator {原创 2020-05-26 16:06:31 · 1392 阅读 · 2 评论 -
SpringAOP的实现原理:2、AOP动态代理过程分析
创建代理的步骤分析: 1、首先对拦截器处理,interceptorNames还指定了一些拦截器进行合并,并将不同格式的拦截器处理成对应的增强器Advisor。 2、声明一个代理的工厂类ProxyFactory,并设置对应的增强器,设置TargeSource等信息。 3、根据设置堆ProxyFactory生成对应的AOPProxy,并获取对应的代理类咱们接着下面段代码分析:Object proxy = createProxy(bean.getClass(), be...原创 2020-05-26 15:40:18 · 286 阅读 · 0 评论 -
SpringAOP 如何获取所有的增强器
在对AOP相关的Bean进行增强的时候,必须要获取增强器,并把增强器应用到到Bean上。那么需要先获取所有的增强器,并构造称为Advisor。 如何获取构造器那下面,我们从findCandidateAdvisors()进行解析。这个方法的调用位置为,在初始化完成之后调用Bean的后置处理器,处理AOP的动态代理的过程中会多次用到。1、AnnotationAwareAspectJAutoProxyCreator.class #findCandidateAdvisors()pro...原创 2020-05-26 15:37:18 · 254 阅读 · 0 评论 -
SpringAOP的实现原理:1、如何获取可用AOP增强器?
接着上面进行分析。我们来分析如何根据Bean的信息获取他对应的拦截器。接着上一篇大纲进行分析:getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);@Overrideprotected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, TargetSource targetSource) { List&l.原创 2020-05-26 15:31:40 · 200 阅读 · 0 评论 -
SpringAOP的实现原理:0、总纲
SpringAOP的作用: 并将那些影响了多个类的公共行为封装到一个可重用模块,减少代码的耦合。增强器的初始化是什么时候初始化的? 第一次调用wrapIfNecessary(bean, beanName, cacheKey)方法的时候就会进行第一次初始化,此时会判断对象上是否有@Aspect或者继承实现AOP相关方法的类,之后根据里面的方法进行构建增强器。在SpringAOP的实现过程中,对bean增强的实现有两个地方: 1、在实例化话完成之后会将实例化...原创 2020-05-26 15:28:03 · 197 阅读 · 0 评论 -
CGLib中类Enhancer介绍
Enhancer常用的方法介绍Enhancer enhancer = new Enhancer();1、设置要继承的父类enhancer.setSuperclass(superclass);2、设置要实现的接口,这里需要实现EnhancedConfiguration,因为EnhancedConfiguration集成了BeanFactoryAware,则要生成对应的实现方法,用于在谁知工厂的时候做增强处理。具体详见ImportAwareBeanPostProcessor。private sta原创 2020-05-26 11:35:05 · 2410 阅读 · 0 评论 -
CGLib中Callback介绍
参考文章: https://blog.csdn.net/zhang6622056/article/details/87286498本篇文章主要参考NeroJings作者的。我只是起到了搬运工的作用。callbacks简介这里的callback可以认为是cglib用于生成字节码的实现手段,cglib一共实现了6种callback,用于对代理类目标进行不同手段的代理,非常灵活,分别为FixedValueInvocationHandlerLazyLoaderMethodInterce.原创 2020-05-26 11:05:01 · 729 阅读 · 0 评论 -
CGLib中CallbackFilter介绍
作用: 在CGLib回调时可以设置对不同方法执行不同的回调逻辑,或者根本不执行回调。示例: 首先定义一个被代理类,包含2个方法: public class Target { public void f(String s,String dsd){ System.out.println("Target f()"); } public void g(int c){ System.out.println("Target g()"...原创 2020-05-26 11:01:03 · 1236 阅读 · 0 评论 -
Spring 循环依赖时,对需要AOP中增强的类如何处理?
Spring 5.1.8 RELEASE例:@Aspect@Componentpublic class LogAspects { //抽取公共的切入点表达式 //1、本类引用 //2、其他的切面引用 @Pointcut("execution(public int com.aop.MathCalculator.*(..))") public void pointCut(){}; //@Before在目标方法之前切入;切入点表达式(指定在哪个方法切入)原创 2020-05-25 09:15:33 · 591 阅读 · 0 评论 -
Spring加载BeanDefinition的过程分析
分析的类:AnnotationConfigWebApplicationContext.classSpringboot启动的时候没有采用这个,具体Springboot的启动方式见后边的文章。 加载BeanDefinition的过程:protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) { //获取reader AnnotatedBeanDefinitionReader ...原创 2020-05-22 14:57:09 · 284 阅读 · 0 评论 -
spring 如何解决循环依赖,为什么要创建三个缓存?
spring是如何解决单例的循环依赖注入:首先看下面三个缓存: 1.singletonObjects:存放初始化好的bean 2.earlySingletonObjects:存放了刚实例化好的,调用getEarlyBeanReference进行扩展( SmartInstantiationAwareBeanPostProcessor)之后的。但是还未配置属性和初始化的bean,bean还在创建的过程中通过getBean可以获取到,用于解决循环依赖的问题。我们在获取该bean的时候会调用be原创 2020-05-22 14:54:42 · 824 阅读 · 0 评论 -
Bean相关的处理器 二、ApplicationListenerDetector
ApplicationListenerDetector:主要作用: 1、在Bean初始化完成之后:如果Bean是单例的则并且bean instanceof ApplicationListener。加入到this.applicationListeners中。 2、在Bean销毁之前搞事情:如果Bean是一个ApplicationListener,则会从ApplicationEventMulticaster(事件广播器)中提前删除了。class ApplicationListene...原创 2020-05-22 14:52:10 · 2048 阅读 · 0 评论 -
Bean相关的处理器 一、ApplicationContextAwareProcessor
作用: 主要就是对那些实现的Aware接口的Bean在实例化完成之后,初始化之前的阶段进行赋值。这也是忽略自动注入Aware这些接口的解决方案。class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; private final StringValueResolver ..原创 2020-05-22 14:51:07 · 125 阅读 · 0 评论 -
AnnotationConfigApplicationContext初始化过程
实例化的方式:public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); //详解 1 register(annotatedClasses); //详解 2 refresh(); //详见Spring容器启动流程}详解 1public AnnotationConfigApplicationContext() { this.reader = ne原创 2020-05-22 13:58:08 · 400 阅读 · 0 评论 -
Spring启动流程核心步骤:10、 finishRefresh()
1、清除上下文资源缓存(如扫描中的ASM元数据)2、初始化上下文的生命周期处理器,并刷新(找出Spring容器中实现了Lifecycle接口的bean并执行start()方法)。3、发布ContextRefreshedEvent事件告知对应的ApplicationListener进行响应的操作protected void finishRefresh() { // Clear context-level resource caches (such as ASM metadata f...原创 2020-05-22 13:40:25 · 230 阅读 · 0 评论 -
Spring启动流程核心步骤:8、registerListeners()
注册监听器protected void registerListeners() { // Register statically specified listeners first. for (ApplicationListener<?> listener : getApplicationListeners()) { getApplicationEventMulticaster().addApplicationListener(listener); }原创 2020-05-21 15:21:26 · 285 阅读 · 0 评论 -
Spring启动流程核心步骤:7、initMessageSource()
初始国际化资源protected void initMessageSource() { ConfigurableListableBeanFactory beanFactory = getBeanFactory(); //判断本地是否包含国际化相关(messageSource)的Bean。 if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) { this.messageSource = beanFact原创 2020-05-21 15:20:19 · 203 阅读 · 0 评论 -
Spring启动流程核心步骤:6、registerBeanPostProcessors(beanFactory)
注册Bean相关的处理器protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) { PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this);}public static void registerBeanPostProcessors( Configurable原创 2020-05-21 15:19:37 · 246 阅读 · 0 评论 -
Spring启动流程核心步骤:5、invokeBeanFactoryPostProcessors(beanFactory)
对于BeanFactory相关的处理器的处理protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { //在下面详细分析 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); //对L原创 2020-05-21 15:18:51 · 135 阅读 · 0 评论 -
Spring启动流程核心步骤:4、postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
不同子类会做不同的事情。下面将以Springboot启动是到的AnnotationConfigServletWebServerApplicationContext来做分析。 比如 :AnnotationConfigServletWebServerApplicationContext.class会进行包的扫描和一些类信息的加载、因为此类在前面没有做这一块。 protected void postProcessBeanFactory(Confi...原创 2020-05-21 15:17:30 · 351 阅读 · 0 评论 -
Spring启动流程核心步骤:3、prepareBeanFactory(beanFactory)
主要作用:protected void prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) { // Tell the internal bean factory to use the context's class loader etc. //初始化类加载器 beanFactory.setBeanClassLoader(getClassLoader()); //初始化SPEL解析器,也就是EL表..原创 2020-05-21 15:07:54 · 199 阅读 · 0 评论 -
Spring启动流程核心步骤: 2、obtainFreshBeanFactory()
2、初始化容器、初始化处理器、加载beanDefinition信息protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {refreshBeanFactory();return getBeanFactory();}有两种实现 : 1、先看咱们项目中注解方式启动采用的GenericApplicationContext@Overrideprotected final void r...原创 2020-05-21 15:06:36 · 188 阅读 · 0 评论 -
Spring启动流程核心步骤 :1、prepareRefresh()
1、容器初始化protected void prepareRefresh() {// Switch to active.this.startupDate = System.currentTimeMillis();this.closed.set(false); //设置上下文状态this.active.set(true);// Initialize any placeholder property sources in the contex...原创 2020-05-21 15:04:43 · 253 阅读 · 0 评论 -
Spring容器启动流程分析
Spring版本:5.1.8.RELEASEAnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);因为我们实例采用注解驱动的,因此我们的容器实例为:AnnotationConfigApplicationContext分析类的继承关系refresh()方法是容器启动最重要的流程,没有之一,里面完成了容器的...原创 2020-05-21 15:01:35 · 376 阅读 · 0 评论