1. 2.5 学习资源historical

    - Spring面试题总结的很全面,附带超详细答案 \- 知乎 - spring是如何解决循环依赖的? \- 掘金

  2. 2.10 Spring模块historical

    1. Spring 核心容器 该层基本上是 Spring Framework 的核心。 - Spring Core - Spring Bean - SpEL (Spring Expression Language) - Spring Context 2. 数据访问/集成 该层提供与数据库交互的支持。

  3. 2.28 ApplicationListenerhistorical

    1. ApplicationListener是什么 就是观察者模式。生产者发布事件,多个消费者监听这个事件处理各自的逻辑,如此解耦了生产者消费者。后续如果还有消费者需要处理这个事件再增加一个Listener即可 2. 如何使用事件监听机制 比如我们有个需要上报工单后需要写邮件、写日志,取消工单后也需

  4. 2.29 Bean作用域historical

    1. 作用域分类 - singleton:每次从容器中获取的bean是同一个 - prototype:每次从容器中获取的bean,都会创建一个新的 - request:在Http请求中使用的同一个bean - session:在http session中使用的是同一个bean 2. 为什么有prot

  5. 2.30 使用historical

    1. 创建项目 2. pom.xml 3. 代码 3.1. 业务逻辑类 - HelloWorld 3.2. 切面类 3.3. 配置类

  6. 2.31 使用historical

    1. 创建项目 2. pom.xml 3. 代码 - AopConfig - Calc - Main

  7. 2.32 Autowired原理historical

    1. 类继承图 2. 原理分析 1. spring容器refresh的时候有两个关键步骤,registerBeanPostProcessors和finishBeanFactoryInitialization 2. registerBeanPostProcessors会向spring容器注入Autow

  8. 2.33 Spring事务源码分析historical

    1. 开启事务管理注解 - @EnableTransactionManagement 这个注解向spring容器中导入了TransactionManagementConfigurationSelector,我们继续研究 2. TransactionManagementConfigurationSel

  9. 2.44 Bean生命周期historical

    1. 流程 - 对Bean进行实例化 - 将值和引用注入到Bean对应的属性中 - 通过Aware接口把Spring底层组件注入Bean - BeanPostProcessor。执行额外的逻辑。在InitializingBean的前后执行,会把当前正在创建的Bean传入 - Initializing

  10. 2.45 是什么historical

    1. AOP是什么 面向切面编程。不改变原有代码的基础上增加功能。 没有AOP之前,我们要增加一个打印日志的功能,可以直接修改原有代码,但这样业务代码和其他代码耦合在一起,不好维护; 有了AOP之后,我只需要在AOP中写这个打印日志的代码,原有的代码不用改动。 2. 实现原理 代理模式.md Spr

  11. 2.46 是什么historical

    1. IOC解释 控制反转。 没有IOC之前我们使用一个对象首先要自己new出来; 有了Spring后是他帮我们new,然后放在容器里,我们直接从容器中获取对象使用。 2. 实现原理 工厂模式+反射+xml解析 扫描所有xml文件,使用dom4j解析,然后创建bean放入工厂中的map中,我们get

  12. 2.47 Spring常用注解historical

    注解作用 @Configuration 相当于之前的applicationContext.xml,就是一个配置文件 @ComponentScan 配置扫描包,如果有@Controller,@Service,@Repositiry,@Component修饰的,则把它加入ioc容器中 @Bean 配合@

  13. 2.48 传播行为historical

    1. 是什么 事务传播行为是Spring对数据库事务的增强特性,用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法时事务如何传播。 一般我们的事务都是写在service方法上,调用dao的方法时生效。 但是如果service A的方法调用service B的方法这种情况该怎么定义呢? 1.1.

  14. 2.52 BeanFactoryhistorical

    1. BeanFactory和ApplicationContext BeanFacotry是实例化、配置、管理Bean的容器 ApplicationContext接口继承了BeanFactory接口,所以提供了BeanFactory的所有功能。他同时还继承了其他接口,如下图: 提供了额外的功能,如更

  15. 2.53 使用historical

    1. 创建项目 2. pom.xml 3. 代码 - DbConfig - TestService - TestDao

  16. 2.54 循环依赖historical

    1. 循环依赖是什么 假设有两个Bean,Bean1和Bean2,如果Bean1依赖Bean2,Bean2依赖Bean1。 那么Spring创建Bean1的时候需要先创建Bean2,创建Bean2又需要先创建Bean1,这就叫做循环依赖 2. 循环依赖会导致什么问题 2.1. 构造器注入会抛出异常

  17. 2.55 Spring中如何让A和B两个bean按顺序加载historical

    1. 使用@DependsOn注解 - TestController - TestService - 启动的时候输出 2. 参考 - Spring 中如何控制2个bean中的初始化顺序? \- 知乎 - @DependsOn或depends\-on配置的使用 \- 掘金

  18. 2.62 1.创建spring容器historical

    1. 要分析的代码 分成创建ApplicationContext和从ApplicationContext中获取Calc的bean这两个过程,我们一步步跟踪 2. 创建ApplicationContext 2.1. AnnotationConfigApplicationContext构造方法 refr

  19. 2.68 2.调用BeanFactoryPostProcessor的postProcess方法historical

    1. 要研究的代码 - AbstractApplicationContext invokeBeanFactoryPostProcessors 关键的是这一句 PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanF

  20. 2.73 3.注册BeanPostProcessorhistorical

    1. 要研究的代码 - AbstractApplicationContext registerBeanPostProcessors PostProcessorRegistrationDelegate.registerBeanPostProcessors(beanFactory, this); 这个作

  21. 2.76 4.实例化所有非懒加载的单实例beanhistorical

    1. 要研究的代码 - finishBeanFactoryInitialization 这个步骤中尤其重要,他的preInstantiateSingletons会实例化所有非懒加载的单实例bean 2. 实例化所有非懒加载的单实例bean 2.1. 获取所有BeanName,一个个创建 - Defa

  22. 2.78 uml图historical

    ��

  23. 2.83 1.给容器中注入AspectJAnnotationAutoProxyCreator组件historical

    一般我们开启aop的功能是通过@EnableAspectJAutoProxy,所以首先查看其源码 1. 开启AOP - @EnableAspectJAutoProxy 关键在于导入的AspectJAutoProxyRegistrar这个类,他想容器中注入了一些组件 2. 注册AspectJAnnot

  24. 2.84 2.1AnnotationAwareAspectJAutoProxyCreator_Bean实例是如何创建的historical

    1. 类继承图 如下图可看出AnnotationAwareAspectJAutoProxyCreator既是一个Bean后置处理器,又是一个实现了BeanFactoryAware接口的类 2. 分析调用栈 我们首先再注入的Calc和LogAspects以及上图关键方法打上断点,运行发现调用流程如下

  25. 2.85 Spring_AOP源码分析总结historical

    创建日期 星期一 22 七月 2019 源码分析 ---- 1. @EnableAspectJAutoProxy @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Import(AspectJAuto

  26. 2.90 2.2AnnotationAwareAspectJAutoProxyCreator是在什么时候起作用的historical

    1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization 我们把断点放行到 - AbstractAutoProxyCreator#postProcessBeforeInitializa

  27. 2.94 2.3AnnotationAwareAspectJAutoProxyCreator具体是怎么创建代理对象的historical

    1. 跟踪调用栈至postProcessBeforeInstantiation 我们继续放行断点,观察Calc实例的创建,断点主要停留在3个地方 2. 判断是否需要创建代理对象 - org.springframework.aop.framework.autoproxy.AbstractAutoPro

  28. 2.96 2.4目标方法是怎么执行的historical

    1. 继续放行断点执行Calc.div 2. 进入到代理对象的intercept方法 - CglibAopProxy.DynamicAdvisedInterceptor#intercept 2.1. 获取拦截器链 - AdvisedSupport#getInterceptorsAndDynamicI