Spring全家桶面试题(一)之Spring Framework(九)

七、Spring其他

64. Spring事件监听的核心机制是什么?

1. 事件监听举例

事件
在这里插入图片描述
事件发布
在这里插入图片描述监听了对应事件的监听器
在这里插入图片描述
当监听器监听的事件发布之后,对应的监听器就会执行。

2. spring的事件监听三个部分

事件(ApplicationEvent) :负责对应相应监听器,事件源发生某事件是特定事件监听器被触发的原因。
监听器(ApplicationListener): 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应逻辑。
事件发布器(ApplicationEventMulticaster ):对应于观察者模式中的被观察者/主题, 负责通知观察者对外提供发布事件和增删事件监听器的接口,维护事件和事件监听器之间的映射关系,并在事件发生时负责通知相关监听器。

Spring事件机制是观察者模式的一种实现,但是除了发布者和监听者者两个角色之外,还有一个EventMultiCaster的角
色负责把事件转发给监听者,工作流程如下:
在这里插入图片描述
也就是说上面代码中发布者调用applicationEventPublisher.publishEvent(msg); 是会将事件发送给了EventMultiCaster, 而后由EventMultiCaster注册着所有的Listener,然后根据事件类型决定转发给那个Listener。

65. Spring 框架中都用到了哪些设计模式?

Spring设计模式总结:

  1. 简单工厂——BeanFactory
  2. 工厂方法——FactoryBean
  3. 单例模式——Bean实例
  4. 适配器模式——SpringMVC中的HandlerAdatper
  5. 装饰器模式——BeanWrapper
  6. 代理模式——AOP底层
  7. 观察者模式——spring的事件监听
  8. 模板方法模式——Spring几乎所有的外接扩展都采用这种模式
  9. 责任链模式——AOP的方法调用

66. Spring是如何整合MyBatis将Mapper接口注册为Bean的原理?

  1. 首先MyBatis的Mapper接口核心是JDK动态代理
  2. Spring会排除接口,无法注册BeanDefinition到IOC容器中
  3. MyBatis 实现了BeanDefinitionRegistryPostProcessor (手工注册)可以动态注册BeanDefinition
  4. 需要自定义扫描器(继承Spring内部扫描器ClassPathBeanDefinitionScanner ) 重写排除接口的方法
    (isCandidateComponent)
  5. 但是接口虽然注册成了BeanDefinition但是无法实例化Bean,因为接口无法实例化
  6. 需要将BeanDefinition的BeanClass 替换成FactoryBean(偷天换日)
  7. Mybatis 通过FactoryBean的工厂方法设计模式可以自由控制Bean的实例化过程,可以在getObject方法中创建JDK动态代理
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值