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 · 480 阅读 · 0 评论 -
Spring中Bean实例化的三种方式
参考文章:忘记了1、构造方法<bean id="person" class="com.dfdc.spring.demo.Person"></bean><bean id="personWithParam" class="com.dfdc.spring.demo.Person"> <constructor-arg name="name" value="等风的草"/></bean><bean id="personWirhPar原创 2020-05-26 16:36:04 · 252 阅读 · 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 · 1505 阅读 · 2 评论 -
Spring加载BeanDefinition的过程分析
分析的类:AnnotationConfigWebApplicationContext.classSpringboot启动的时候没有采用这个,具体Springboot的启动方式见后边的文章。 加载BeanDefinition的过程:protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) { //获取reader AnnotatedBeanDefinitionReader ...原创 2020-05-22 14:57:09 · 316 阅读 · 0 评论 -
spring 如何解决循环依赖,为什么要创建三个缓存?
spring是如何解决单例的循环依赖注入:首先看下面三个缓存: 1.singletonObjects:存放初始化好的bean 2.earlySingletonObjects:存放了刚实例化好的,调用getEarlyBeanReference进行扩展( SmartInstantiationAwareBeanPostProcessor)之后的。但是还未配置属性和初始化的bean,bean还在创建的过程中通过getBean可以获取到,用于解决循环依赖的问题。我们在获取该bean的时候会调用be原创 2020-05-22 14:54:42 · 853 阅读 · 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 · 2113 阅读 · 0 评论 -
Bean相关的处理器 一、ApplicationContextAwareProcessor
作用: 主要就是对那些实现的Aware接口的Bean在实例化完成之后,初始化之前的阶段进行赋值。这也是忽略自动注入Aware这些接口的解决方案。class ApplicationContextAwareProcessor implements BeanPostProcessor { private final ConfigurableApplicationContext applicationContext; private final StringValueResolver ..原创 2020-05-22 14:51:07 · 148 阅读 · 0 评论 -
AnnotationConfigApplicationContext初始化过程
实例化的方式:public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { this(); //详解 1 register(annotatedClasses); //详解 2 refresh(); //详见Spring容器启动流程}详解 1public AnnotationConfigApplicationContext() { this.reader = ne原创 2020-05-22 13:58:08 · 418 阅读 · 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 · 253 阅读 · 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 · 324 阅读 · 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 · 249 阅读 · 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 · 274 阅读 · 0 评论 -
Spring启动流程核心步骤:5、invokeBeanFactoryPostProcessors(beanFactory)
对于BeanFactory相关的处理器的处理protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) { //在下面详细分析 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors()); //对L原创 2020-05-21 15:18:51 · 158 阅读 · 0 评论 -
Spring启动流程核心步骤:4、postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
不同子类会做不同的事情。下面将以Springboot启动是到的AnnotationConfigServletWebServerApplicationContext来做分析。 比如 :AnnotationConfigServletWebServerApplicationContext.class会进行包的扫描和一些类信息的加载、因为此类在前面没有做这一块。 protected void postProcessBeanFactory(Confi...原创 2020-05-21 15:17:30 · 400 阅读 · 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 · 221 阅读 · 0 评论 -
Spring启动流程核心步骤: 2、obtainFreshBeanFactory()
2、初始化容器、初始化处理器、加载beanDefinition信息protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {refreshBeanFactory();return getBeanFactory();}有两种实现 : 1、先看咱们项目中注解方式启动采用的GenericApplicationContext@Overrideprotected final void r...原创 2020-05-21 15:06:36 · 240 阅读 · 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 · 283 阅读 · 0 评论 -
Spring容器启动流程分析
Spring版本:5.1.8.RELEASEAnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class);因为我们实例采用注解驱动的,因此我们的容器实例为:AnnotationConfigApplicationContext分析类的继承关系refresh()方法是容器启动最重要的流程,没有之一,里面完成了容器的...原创 2020-05-21 15:01:35 · 421 阅读 · 0 评论