一堆八股文
三级缓存解决循环依赖
说下说三个缓存的名字、怎么搭配的、和简单说下getBean的流程。
singletonObjects、earlySingletonObjects、singletonFactories
getBean流程
去说说getBean的流程
JDK动态代理 Cglib代理选取。简单说下俩个bean的特点,代理类类名特点。
JDK动态代理 :这个比较熟悉直接梳理,也比较简单。
创建入口JdkDynamicAopProxy类的getProxy 方法里,直接调用了JDK的方法,直接把this作为 InvocationHandler传进去了,那么所有JDK动态代理的对象都是JdkDynamicAopProxy的invoker来处理了。
/**public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
InvocationHandler h)
*/
return Proxy.newProxyInstance(classLoader, proxiedInterfaces, this);
Cglib代理:这个DeBug过看具体的Spring Bean实例也不陌生一堆Enhancer
创建入口CglibAopProxy类的getProxy 方法里,先Enhancer enhancer = createEnhancer();然后一堆设置属性最主要的属性enhancer.setCallbacks(callbacks);
,一堆判断,最后enhancer.create()
(有构造函数就是传构成函数的enhancer.create(this.constructorArgTypes, this.constructorArgs)
)。
简绍AOP有个不错的博客Spring源码剖析-拜托面试官别再问我AOP原理了。
自己的bean怎么注入到spring
说说自己写的那个注解,实现枚举类自动暴露HTTP接口。
第一步:javassist 写字节码。(也可用牛逼轰轰的ASM)
第二步:构建BeanDefinition注入到Spring。
也可以引申为MyBatis 怎么注入的Spring。
说下代理类的Handle是 :MapperProxy 的 invoke 方法。
说下包扫描,解析XML,将 mapper 文件中的每个 SQL 封装成 MappedStatement。
再说下包扫描解析接口生成JDK动态代理。
AOP 怎么实现的切面
所有的动态代理的类的Handle都是 JdkDynamicAopProxy 这个invoker会获取切面的一个链,封装一个ReflectiveMethodInvocation然后依次调用。参考:JdkDynamicAopProxy 学习。
Cglib代理类的Handle就是CglibAopProxy,来处理。
事务管理
基于AOP实现。
事务增强对该接口的实现为TransactionInterceptor。invoker方法。里用的就是TransactionManager
PlatformTransactionManager 是所有事务管理必须实现的接口。继承了TransactionManager。有三个方法getTransaction、commit、rollback 参数都是TransactionStatus status
AbstractPlatformTransactionManager 是一个抽象好的基类。
Spring MVC
DispatcherServlet
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/76451.html