# spring5.2.x **Repository Path**: fafi09/spring5.2.x ## Basic Information - **Project Name**: spring5.2.x - **Description**: spring5.2.x ioc aop 源码分析 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-10-19 - **Last Updated**: 2024-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 环境搭建 ### 检查kolin插件版本号与gradle中的是否一致 ### Error:(350, 51) java: 找不到符号 符号: 变量 CoroutinesUtils 位置: 类 org.springframework.core.ReactiveAdapterRegistry.CoroutinesRegistrar - spring-core\kotlin-coroutines\build\libs\kotlin-coroutines-5.2.10.BUILD-SNAPSHOT.jar 右键add as lib-> 选择module-> spring.spring-core.main ### 安装aspectj ## springBean ### bean Defination建立 1. DefaultListableBeanFactory.registerBeanDefinition - stack registerBeanDefinition:932, DefaultListableBeanFactory (org.springframework.beans.factory.support) registerBeanDefinition:164, BeanDefinitionReaderUtils (org.springframework.beans.factory.support) processBeanDefinition:311, DefaultBeanDefinitionDocumentReader (org.springframework.beans.factory.xml) parseDefaultElement:197, DefaultBeanDefinitionDocumentReader (org.springframework.beans.factory.xml) parseBeanDefinitions:176, DefaultBeanDefinitionDocumentReader (org.springframework.beans.factory.xml) doRegisterBeanDefinitions:149, DefaultBeanDefinitionDocumentReader (org.springframework.beans.factory.xml) registerBeanDefinitions:96, DefaultBeanDefinitionDocumentReader (org.springframework.beans.factory.xml) registerBeanDefinitions:511, XmlBeanDefinitionReader (org.springframework.beans.factory.xml) doLoadBeanDefinitions:391, XmlBeanDefinitionReader (org.springframework.beans.factory.xml) loadBeanDefinitions:338, XmlBeanDefinitionReader (org.springframework.beans.factory.xml) loadBeanDefinitions:310, XmlBeanDefinitionReader (org.springframework.beans.factory.xml) 2. bean的建立 - stack instantiateBean:1304, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBeanInstance:1213, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:556, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 2024918163 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$5) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:227, AbstractBeanFactory (org.springframework.beans.factory.support) resolveNamedBean:1175, DefaultListableBeanFactory (org.springframework.beans.factory.support) resolveBean:420, DefaultListableBeanFactory (org.springframework.beans.factory.support) getBean:349, DefaultListableBeanFactory (org.springframework.beans.factory.support) getBean:342, DefaultListableBeanFactory (org.springframework.beans.factory.support) *** ### ApplicationContext方式 createBean:517, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 349420578 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$10) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support) preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support) finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support) refresh:551, AbstractApplicationContext (org.springframework.context.support) :144, ClassPathXmlApplicationContext (org.springframework.context.support) :85, ClassPathXmlApplicationContext (org.springframework.context.support) contextTest:22, TestApp (com.fafi.spring.test) *** ### beanProcessor--stack postProcessBeforeInitialization:9, SelfBeanProcessor (com.fafi.spring.test.beanprocessor) applyBeanPostProcessorsBeforeInitialization:415, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1786, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 247944893 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$9) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support) preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support) finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support) refresh:551, AbstractApplicationContext (org.springframework.context.support) :144, ClassPathXmlApplicationContext (org.springframework.context.support) :85, ClassPathXmlApplicationContext (org.springframework.context.support) contextTest:22, TestApp (com.fafi.spring.test) *** # aop ## @import processImports:557, ConfigurationClassParser (org.springframework.context.annotation) doProcessConfigurationClass:311, ConfigurationClassParser (org.springframework.context.annotation) processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:199, ConfigurationClassParser (org.springframework.context.annotation) doProcessConfigurationClass:304, ConfigurationClassParser (org.springframework.context.annotation) processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:207, ConfigurationClassParser (org.springframework.context.annotation) parse:175, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## @AppConfig processImports:582, ConfigurationClassParser (org.springframework.context.annotation) doProcessConfigurationClass:311, ConfigurationClassParser (org.springframework.context.annotation) processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:207, ConfigurationClassParser (org.springframework.context.annotation) parse:175, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## 处理每个selectors importCandidates processImports:557, ConfigurationClassParser (org.springframework.context.annotation) [2] processImports:583, ConfigurationClassParser (org.springframework.context.annotation) [1] doProcessConfigurationClass:311, ConfigurationClassParser (org.springframework.context.annotation) processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:207, ConfigurationClassParser (org.springframework.context.annotation) parse:175, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## processConfigurationClass processConfigurationClass:230, ConfigurationClassParser (org.springframework.context.annotation) [2] processImports:600, ConfigurationClassParser (org.springframework.context.annotation) processImports:583, ConfigurationClassParser (org.springframework.context.annotation) doProcessConfigurationClass:311, ConfigurationClassParser (org.springframework.context.annotation) processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) [1] parse:207, ConfigurationClassParser (org.springframework.context.annotation) parse:175, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## 前面相当于注册每个component processors 下面进行执行 postProcessBeanFactory:245, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanFactoryPostProcessors:291, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:131, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## 第一个appconfig postProcessBeforeInitialization:14, RealizedAopBeanPostProcessor (com.fafi.spring.test.beanprocessor) applyBeanPostProcessorsBeforeInitialization:415, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1786, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 11003494 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$32) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support) preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support) finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support) refresh:551, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## 执行自定义BeanFactoryPostProcessor postProcessBeanFactory:30, RegisterBeanFactoryPostProcessor (com.fafi.spring.test.beanprocessor) invokeBeanFactoryPostProcessors:291, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:182, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## 执行自定义BeanPostProcessor,生成代理 postProcessBeforeInitialization:18, RealizedAopBeanPostProcessor (com.fafi.spring.test.beanprocessor) applyBeanPostProcessorsBeforeInitialization:415, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1786, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 11003494 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$32) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support) preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support) finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support) refresh:551, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) ## aspect 存储 classzzProxyBeanHolder k com.fafi.spring.selfaop.test.dao.IndexDao v List - className = "com.fafi.spring.selfaop.test.aspect.TestAop" methodName = "testAround" annotationName = "com.fafi.spring.test.annotation.AroundBaomw" - className = "com.fafi.spring.selfaop.test.aspect.TestAop" methodName = "testAfter" annotationName = "com.fafi.spring.test.annotation.AfterBaomw" - className = "com.fafi.spring.selfaop.test.aspect.TestAop" methodName = "testBefore" annotationName = "com.fafi.spring.test.annotation.BeforeBaomw" ## 除appconfig之外的component何时被解析的 doProcessConfigurationClass:332, ConfigurationClassParser (org.springframework.context.annotation) [2] processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:199, ConfigurationClassParser (org.springframework.context.annotation) doProcessConfigurationClass:304, ConfigurationClassParser (org.springframework.context.annotation) [1] processConfigurationClass:250, ConfigurationClassParser (org.springframework.context.annotation) parse:207, ConfigurationClassParser (org.springframework.context.annotation) parse:175, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) main:18, Text (com.fafi.spring.selfaop.test) - ConfigurationClassParser.doProcessConfigurationClass中解析componentScan ## 总结 1. appconfig中带三个注解 - @Configuration相当于component - @ComponentScan("com.fafi.spring.selfaop.test")扫描目录的组件 - @EnableAop包含@Import(CustomizedAopImportSelector.class)在invokeBeanFactoryPostProcessors被解析 2. 在main函数中new AnnotationConfigApplicationContext(Appconfig.class); 这时初始化的beanFactory的beanDefinationNames中就有了appconfig 3. 在进行到refresh:533,invokeBeanFactoryPostProcessors是会得到appconfig的componentScan 根据扫描,得到扫描路径("com.fafi.spring.selfaop.test")的其他component TestAop,IndexDao 4. 接着向下执行processImports:582,因为@EnableAop包含@Import(CustomizedAopImportSelector.class) 所以解析后得到RealizedAopBeanPostProcessor.class, RegisterBeanFactoryPostProcessor.class 两个processor在beanDefination里 5. 在invokeBeanFactoryPostProcessors:182, PostProcessorRegistrationDelegate里 执行RegisterBeanFactoryPostProcessor,解析beandefination里带@AopJ注解的bean,这里 指TestAop,解析完形成上面的classzzProxyBeanHolder,至此BeanFactoryPostProcessors完成 6. 在finishBeanFactoryInitialization中生成IndexDao这个bean时会生成它的代理类 这个代理类会执行CustomizedProxyInterceptor的intercept方法,这个方法中按照classzzProxyBeanHolder 执行切面方法 # spring的aop实现 ## AnnotationAwareAspectJAutoProxyCreator initBeanFactory:80, AnnotationAwareAspectJAutoProxyCreator (org.springframework.aop.aspectj.annotation) setBeanFactory:65, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy) invokeAwareMethods:1816, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1781, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 2038148563 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$32) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:207, AbstractBeanFactory (org.springframework.beans.factory.support) registerBeanPostProcessors:229, PostProcessorRegistrationDelegate (org.springframework.context.support) registerBeanPostProcessors:723, AbstractApplicationContext (org.springframework.context.support) refresh:536, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) aopAnnoTest:69, TestApp (com.fafi.spring.test) ## getAdvicesAndAdvisorsForBean 建立代理 getAdvicesAndAdvisorsForBean:78, AbstractAdvisorAutoProxyCreator (org.springframework.aop.framework.autoproxy) wrapIfNecessary:347, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy) postProcessAfterInitialization:299, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy) applyBeanPostProcessorsAfterInitialization:430, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) initializeBean:1798, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) doCreateBean:594, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) createBean:516, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support) lambda$doGetBean$0:324, AbstractBeanFactory (org.springframework.beans.factory.support) getObject:-1, 2038148563 (org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$32) getSingleton:234, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support) doGetBean:322, AbstractBeanFactory (org.springframework.beans.factory.support) getBean:202, AbstractBeanFactory (org.springframework.beans.factory.support) preInstantiateSingletons:897, DefaultListableBeanFactory (org.springframework.beans.factory.support) finishBeanFactoryInitialization:879, AbstractApplicationContext (org.springframework.context.support) refresh:551, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) aopAnnoTest:69, TestApp (com.fafi.spring.test) ## AspectJAutoProxyRegistrar注册org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator registerBeanDefinitions:45, AspectJAutoProxyRegistrar (org.springframework.context.annotation) registerBeanDefinitions:86, ImportBeanDefinitionRegistrar (org.springframework.context.annotation) lambda$loadBeanDefinitionsFromRegistrars$1:384, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) accept:-1, 631659383 (org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader$$Lambda$46) forEach:684, LinkedHashMap (java.util) loadBeanDefinitionsFromRegistrars:383, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) loadBeanDefinitionsForConfigurationClass:148, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) loadBeanDefinitions:120, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) processConfigBeanDefinitions:331, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) *** # @condition 执行 matches:10, SelfCondition (com.fafi.spring.condition) shouldSkip:108, ConditionEvaluator (org.springframework.context.annotation) loadBeanDefinitionsForBeanMethod:184, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) loadBeanDefinitionsForConfigurationClass:144, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) loadBeanDefinitions:120, ConfigurationClassBeanDefinitionReader (org.springframework.context.annotation) processConfigBeanDefinitions:331, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) :89, AnnotationConfigApplicationContext (org.springframework.context.annotation) conditionTest:76, TestApp (com.fafi.spring.test) *** # springboot ## 1. new SpringApplication + setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class)); 设置ApplicationContextInitializer,将spring.factories中的ApplicationContextInitializer注册到SpringApplication ApplicationContextInitializer重写Initializer方法,为beanFactory注册processors + setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class)); 设置监听器发布者,将spring.factories中的ApplicationListener注册到SpringApplication EventPublishingRunListener ## 2.run + stack run:304, SpringApplication (org.springframework.boot) run:1237, SpringApplication (org.springframework.boot) run:1226, SpringApplication (org.springframework.boot) main:40, SampleAopApplication (smoketest.aop) + SpringApplicationRunListeners listeners = getRunListeners(args); 得到EventPublishingRunListener + listeners.starting(); 向各个listener发布ApplicationStartingEvent 1 = {ConfigFileApplicationListener@3206} 2 = {AnsiOutputApplicationListener@3207} 3 = {LoggingApplicationListener@3208} 4 = {BackgroundPreinitializer@3071} 5 = {ClasspathLoggingApplicationListener@3209} 6 = {DelegatingApplicationListener@3210} 7 = {ParentContextCloserApplicationListener@3211} 8 = {ClearCachesApplicationListener@3212} 9 = {FileEncodingApplicationListener@3213} 10 = {LiquibaseServiceLocatorApplicationListener@3214} + ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); I. 判断Environment是否存在,不存在就创建(如果是web项目就创建StandardServletEnvironment,否则创建StandardEnvironment) II. 配置Environment:配置profile以及properties III. 调用SpringApplicationRunListener的environmentPrepared()方法,通知事件监听者:应用的Environment已经准备好 >> configureEnvironment:483, SpringApplication (org.springframework.boot) prepareEnvironment:343, SpringApplication (org.springframework.boot) run:308, SpringApplication (org.springframework.boot) run:1237, SpringApplication (org.springframework.boot) run:1226, SpringApplication (org.springframework.boot) main:40, SampleAopApplication (smoketest.aop) + Banner printedBanner = printBanner(environment); 设置banner + context = createApplicationContext(); 根据不同的环境创建不同的applicationcontext + prepareContext(context, environment, listeners, applicationArguments, printedBanner); 将准备好的Environment设置给ApplicationContext 遍历调用所有的ApplicationContextInitializer的initialize()方法来对已经创建好的ApplicationContext进行进一步的处理 调用SpringApplicationRunListener的contextPrepared()方法,通知所有的监听者:ApplicationContext已经准备完毕 将所有的bean加载到容器中 调用SpringApplicationRunListener的contextLoaded()方法,通知所有的监听者:ApplicationContext已经装载完毕 + refreshContext(context); 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序 + afterRefresh(context, applicationArguments); 查找当前context中是否注册有CommandLineRunner和ApplicationRunner,如果有则遍历执行它们。 + listeners.started(context); 执行所有SpringApplicationRunListener的started()方法 *** # 发现问题 1. + Execution failed for task ':buildSrc:checkFormatMain'. > Formatting violations found in the following files: ‘* src/main/java/org/springframework/boot/build/log4j2/ReproducibleLog4j2PluginsDatAction.java + 解决方法:gradlew -p buildSrc format 2. Could not evaluate condition on org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurat + 解决方法:application.java不能直接放在main/java下。必须建一个package 3. AutoConfigurationImportSelector到底怎么初始化, AutoConfigurationImportSelector#selectImports打上断点测试,debug没进去 + 解决方法:SpringBoot在启动中,AutoConfigurationImportSelector在被加载中,调用的不是selectImports方法, 而是直接被调用了getAutoConfigurationEntry方法 >> getAutoConfigurationEntry:119, AutoConfigurationImportSelector (org.springframework.boot.autoconfigure) process:434, AutoConfigurationImportSelector$AutoConfigurationGroup (org.springframework.boot.autoconfigure) getImports:879, ConfigurationClassParser$DeferredImportSelectorGrouping (org.springframework.context.annotation) processGroupImports:809, ConfigurationClassParser$DeferredImportSelectorGroupingHandler (org.springframework.context.annotation) process:780, ConfigurationClassParser$DeferredImportSelectorHandler (org.springframework.context.annotation) parse:193, ConfigurationClassParser (org.springframework.context.annotation) processConfigBeanDefinitions:319, ConfigurationClassPostProcessor (org.springframework.context.annotation) postProcessBeanDefinitionRegistry:236, ConfigurationClassPostProcessor (org.springframework.context.annotation) invokeBeanDefinitionRegistryPostProcessors:280, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:96, PostProcessorRegistrationDelegate (org.springframework.context.support) invokeBeanFactoryPostProcessors:707, AbstractApplicationContext (org.springframework.context.support) refresh:533, AbstractApplicationContext (org.springframework.context.support) refresh:758, SpringApplication (org.springframework.boot) refresh:750, SpringApplication (org.springframework.boot) refreshContext:397, SpringApplication (org.springframework.boot) run:315, SpringApplication (org.springframework.boot) run:1237, SpringApplication (org.springframework.boot) run:1226, SpringApplication (org.springframework.boot) main:25, SelfStarterTest (com.fafi.selfstarter.test.app) *** # 编写自定义starter ## 1.引入对应的依赖 ## 2.编写实现类 ## 3.编写配置文件读取类 主要注解是@ConfigruationProperties(“配置的值例如 example.a”) ## 4.编写自动装配类 ## 5.编写默认的配置文件 ## 6.在resources/META-INF/spring.factories 中配置我们的自动装配类 *** # springmvc ## 问题 ### 1.访问不到controller >> 解决方法:tomcat的applicationcontext设置为example >web.xml中DispatcherServlet的url-pattern设置为"/" >然后http://localhost:8080/example/sayHello?age=12&name=Jack可访问到 *** ### 文件上传 ## 1.导入jar包commons-fileupload-1.2.1.jar commons-io-1.3.2.jar ## 2.在springmvc配置文件中配置上传解析器 CommonsMultipartResolver ## 3.编写Controller代码FileController ## 4.编写jsp页面代码upload.jsp *** ### 浏览器Form表单只支持GET POST方式的请求 >> Spring3.0添加了一个过滤器org.springframework.web.filter.HiddenHttpMethodFilter 通过隐藏字段_method可以将POST请求转换为DELETE PUT请求 >> 1.配置web.xml >> hiddenHttpMethodFilter org.springframework.web.filter.HiddenHttpMethodFilter hiddenHttpMethodFilter example 2.在jsp的form表单中增加隐藏字段
### Ajax和Controller的交互 ## 1.在ajax的提交请求里,传给后台的数据格式是json串 >> $.ajax({ type : "post", url : "../tm.v", contentType:"application/json; charset=utf-8", data:'{"name":"shouji","price":"8888"}',//此处就是标题中提到的传入的json格式串 success : function(r) { //r 直接就是jsonObject //如果返回的r是字符串,在调用r.price之前需要把字符串转为json对象,var jsonObject = JSON.parse(r); alert(r.price); } }) ## 2.在controller的方法返回值里,传给前台的数据格式是json,并且在方法的参数里接收的也是json串 >> //@ResponseBody注解和方法的返回值被置为BYQ,是为了返回值是json格式 //@RequestBody注解和方法的参数是BYQ类型,是为了接收前台提交过了的json格式 @RequestMapping("tm") @ResponseBody public BYQ tm(@RequestBody BYQ byq2){ System.out.println(byq2.getName()); System.out.println(byq2.getPrice()); return byq2; } ## 3.bean BYQ必须有默认的构造方法 # mvc interceptros ## 拦截方法 ### 1.preHandle(): 这个方法在业务处理器处理请求之前被调用,SpringMVC 中的Interceptor 是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor 。每个Interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor 中的preHandle 方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean 类型的,当它返回为false 时,表示请求结束,后续的Interceptor 和Controller 都不会再执行;当返回值为true 时就会继续调用下一个Interceptor 的preHandle 方法,如果已经是最后一个Interceptor 的时候就会是调用当前请求的Controller 方法。 ### 2.postHandle():这个方法在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对Controller 处理之后的ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行。 ### 3.afterCompletion():该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。 *** # converterandformatter ## 1.调用堆栈 >> parse:23, DateFormatter (com.fafi.selfmvc.convertor) parse:10, DateFormatter (com.fafi.selfmvc.convertor) convert:217, FormattingConversionService$ParserConverter (org.springframework.format.support) invokeConverter:41, ConversionUtils (org.springframework.core.convert.support) convert:191, GenericConversionService (org.springframework.core.convert.support) convertIfNecessary:129, TypeConverterDelegate (org.springframework.beans) convertIfNecessary:585, AbstractNestablePropertyAccessor (org.springframework.beans) convertForProperty:604, AbstractNestablePropertyAccessor (org.springframework.beans) processLocalProperty:453, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValue:278, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValue:266, AbstractNestablePropertyAccessor (org.springframework.beans) setPropertyValues:97, AbstractPropertyAccessor (org.springframework.beans) applyPropertyValues:848, DataBinder (org.springframework.validation) doBind:744, DataBinder (org.springframework.validation) doBind:197, WebDataBinder (org.springframework.web.bind) bind:107, ServletRequestDataBinder (org.springframework.web.bind) bindRequestParameters:158, ServletModelAttributeMethodProcessor (org.springframework.web.servlet.mvc.method.annotation) resolveArgument:160, ModelAttributeMethodProcessor (org.springframework.web.method.annotation) resolveArgument:121, HandlerMethodArgumentResolverComposite (org.springframework.web.method.support) getMethodArgumentValues:167, InvocableHandlerMethod (org.springframework.web.method.support) invokeForRequest:134, InvocableHandlerMethod (org.springframework.web.method.support) invokeAndHandle:105, ServletInvocableHandlerMethod (org.springframework.web.servlet.mvc.method.annotation) invokeHandlerMethod:878, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation) handleInternal:792, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation) handle:87, AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method) doDispatch:1040, DispatcherServlet (org.springframework.web.servlet) doService:943, DispatcherServlet (org.springframework.web.servlet) processRequest:1006, FrameworkServlet (org.springframework.web.servlet) doPost:909, FrameworkServlet (org.springframework.web.servlet) service:650, HttpServlet (javax.servlet.http) service:883, FrameworkServlet (org.springframework.web.servlet) service:731, HttpServlet (javax.servlet.http) internalDoFilter:303, ApplicationFilterChain (org.apache.catalina.core) ## 2.createBinder >> createBinder:56, DefaultDataBinderFactory (org.springframework.web.bind.support) updateBindingResult:209, ModelFactory (org.springframework.web.method.annotation) updateModel:195, ModelFactory (org.springframework.web.method.annotation) getModelAndView:987, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation) invokeHandlerMethod:883, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation) handleInternal:792, RequestMappingHandlerAdapter (org.springframework.web.servlet.mvc.method.annotation) handle:87, AbstractHandlerMethodAdapter (org.springframework.web.servlet.mvc.method) doDispatch:1040, DispatcherServlet (org.springframework.web.servlet) doService:943, DispatcherServlet (org.springframework.web.servlet) processRequest:1006, FrameworkServlet (org.springframework.web.servlet) doPost:909, FrameworkServlet (org.springframework.web.servlet) service:650, HttpServlet (javax.servlet.http) service:883, FrameworkServlet (org.springframework.web.servlet) service:731, HttpServlet (javax.servlet.http) internalDoFilter:303, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) doFilterInternal:94, HiddenHttpMethodFilter (org.springframework.web.filter) doFilter:119, OncePerRequestFilter (org.springframework.web.filter) internalDoFilter:241, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) doFilter:52, WsFilter (org.apache.tomcat.websocket.server) internalDoFilter:241, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) doFilter:71, Log4jServletFilter (org.apache.logging.log4j.web) internalDoFilter:241, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) invoke:219, StandardWrapperValve (org.apache.catalina.core) invoke:110, StandardContextValve (org.apache.catalina.core) invoke:498, AuthenticatorBase (org.apache.catalina.authenticator) invoke:169, StandardHostValve (org.apache.catalina.core) invoke:103, ErrorReportValve (org.apache.catalina.valves) invoke:1025, AccessLogValve (org.apache.catalina.valves) invoke:116, StandardEngineValve (org.apache.catalina.core) service:445, CoyoteAdapter (org.apache.catalina.connector) process:1139, AbstractHttp11Processor (org.apache.coyote.http11) process:637, AbstractProtocol$AbstractConnectionHandler (org.apache.coyote) doRun:2555, AprEndpoint$SocketProcessor (org.apache.tomcat.util.net) run:2544, AprEndpoint$SocketProcessor (org.apache.tomcat.util.net) runWorker:1142, ThreadPoolExecutor (java.util.concurrent) run:617, ThreadPoolExecutor$Worker (java.util.concurrent) run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads) run:745, Thread (java.lang) ## 2.默认的@DateTimeFormat(pattern="yyyy-MM-dd")调用栈 >>getFormatter:70, DateTimeFormatAnnotationFormatterFactory (org.springframework.format.datetime) getPrinter:61, DateTimeFormatAnnotationFormatterFactory (org.springframework.format.datetime) getPrinter:40, DateTimeFormatAnnotationFormatterFactory (org.springframework.format.datetime) convert:278, FormattingConversionService$AnnotationPrinterConverter (org.springframework.format.support) invokeConverter:41, ConversionUtils (org.springframework.core.convert.support) convert:191, GenericConversionService (org.springframework.core.convert.support) formatFieldValue:130, AbstractPropertyBindingResult (org.springframework.validation) getFieldValue:229, AbstractBindingResult (org.springframework.validation) :129, BindStatus (org.springframework.web.servlet.support) getBindStatus:178, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) getPropertyPath:199, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) getName:164, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) autogenerateId:149, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) resolveId:139, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) writeDefaultAttributes:122, AbstractDataBoundFormElementTag (org.springframework.web.servlet.tags.form) writeDefaultAttributes:460, AbstractHtmlElementTag (org.springframework.web.servlet.tags.form) writeTagContent:357, InputTag (org.springframework.web.servlet.tags.form) doStartTagInternal:87, AbstractFormTag (org.springframework.web.servlet.tags.form) doStartTag:83, RequestContextAwareTag (org.springframework.web.servlet.tags) _jspx_meth_form_005finput_005f3:26, addGoods_jsp (org.apache.jsp.WEB_002dINF.pages) _jspService:26, addGoods_jsp (org.apache.jsp.WEB_002dINF.pages) service:70, HttpJspBase (org.apache.jasper.runtime) service:731, HttpServlet (javax.servlet.http) service:439, JspServletWrapper (org.apache.jasper.servlet) serviceJspFile:395, JspServlet (org.apache.jasper.servlet) service:339, JspServlet (org.apache.jasper.servlet) service:731, HttpServlet (javax.servlet.http) internalDoFilter:303, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) doFilter:52, WsFilter (org.apache.tomcat.websocket.server) internalDoFilter:241, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) doFilter:64, Log4jServletFilter (org.apache.logging.log4j.web) internalDoFilter:241, ApplicationFilterChain (org.apache.catalina.core) doFilter:208, ApplicationFilterChain (org.apache.catalina.core) invoke:743, ApplicationDispatcher (org.apache.catalina.core) processRequest:485, ApplicationDispatcher (org.apache.catalina.core) doForward:410, ApplicationDispatcher (org.apache.catalina.core) forward:337, ApplicationDispatcher (org.apache.catalina.core) renderMergedOutputModel:171, InternalResourceView (org.springframework.web.servlet.view) render:316, AbstractView (org.springframework.web.servlet.view) render:1373, DispatcherServlet (org.springframework.web.servlet) processDispatchResult:1118, DispatcherServlet (org.springframework.web.servlet) doDispatch:1057, DispatcherServlet (org.springframework.web.servlet) doService:943, DispatcherServlet (org.springframework.web.servlet) processRequest:1006, FrameworkServlet (org.springframework.web.servlet) doGet:898, FrameworkServlet (org.springframework.web.servlet) service:624, HttpServlet (javax.servlet.http) service:883, FrameworkServlet (org.springframework.web.servlet) service:731, HttpServlet (javax.servlet.http) *** # 异步请求 ## 问题 1. Cannot dispatch without an AsyncContext >> 原因:jsp中的 contentType jsp与html设置不同,必须完全相同,空格也必须一样 # RestTemplatte ## 问题 1. org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Unrecognized token 'Exception': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false'); nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Exception': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (PushbackInputStream); line: 1, column: 11] JSON parse error: Cannot construct instance of `com.fafi.selfmvc.vo.MyBean` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"age":33,"name":"searchtm"}') org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `com.fafi.selfmvc.vo.MyBean` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"age":33,"name":"searchtm"}'); nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot construct instance of `com.fafi.selfmvc.vo.MyBean` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('{"age":33,"name":"searchtm"}') at [Source: (PushbackInputStream); line: 1, column: 1] 解决方法: 在MyBean中增加构造方法 public MyBean(String json) { MyBean bean = JSON.parseObject(json, MyBean.class); this.name = bean.name; this.age = bean.age; } # 静态资源无法加载到原因 >> 用全标签