1、SpringBoot的自动装配原理?(必问)
1)在启动类启动时加载@SpringBootApplication注解
2)在@SpringBootApplication注解里面包含三个注解:@ComponentScan,@Configuration,@EnableAutoConfiguration
3)@Configuration表明启动类是一个配置类
4)@ComponentScan自动扫描启动类所在目录及子目录在Spring组件,让其实例化
5)@EnableAutoConfiguration注解里面包含AutoConfigurationImportSelector配置类
6)在AutoConfigurationImportSelecto配置类中会读取springboot自动配置包中的META-INF的spring.factories文件
7)该spring.factories文件包含一两百个SpringBoot写好的自动配置类
8)这些自动配置并不是默认生效的,而是根据环境中导入starter启动器依赖及自动配置类上@ConditionalOnClass注解来决定该配置类是否生效。
9)一旦自动配置类生效了,里面@Bean注解会把创建实例放入IOC容器
10)我们在项目中就可以随时使用@Autowired进行注入并使用
2、请问关于设计数据库你有什么心得?(必问)
1)关系数据库的三大范式
第一范式(1NF):字段不可分,否则就不是关系数据库
第二范式(2NF):有主键,非主键字段依赖主键;突出唯一性
第三范式(3NF):非主键字段不能相互依赖。每列都与主键有直接关系
2)冗余字段设计(解决一对多关系)
比如文章表故意冗余了作者名称字段,这样查询文章时直接显示作者名称,减少关联表查找作者表,提高查询效率。
3)一个字段存储多个ID值(用逗号隔开)(解决多对多的关系)
减少表连接,提高查询效率
比如,自媒体或App文章的多个封面图片地址,设计一个封面字段images存储了所有封面地址,每个地址用逗号隔开。
3、如何避免定时任务的重复调度?
利用分布式任务调度技术,如XXL-Job
XXL-Job创建任务时可以设置任务调度规则,规则可以设置为轮询策略或随机或分片广播
4、请说说Spring是如何解决循环依赖问题的?
属性注入的循环依赖:
@Component
public class TestService1{
@Autowired
private TestSerivice2 service2;
}
@Component
public class TestService2{
@Autowired
private TestSerivice1 service1;
}
spring内部有三级缓存(三个Map结构):
1)singletonObjects 一级缓存,用于存放完全初始化好的 bean(最终要被用户使用)
2)earlySingletonObjects 二级缓存,存放原始的 bean 对象(尚未填充属性),避免Bean实例化完成但未初始。
3)singletonFactories 三级缓存,存放 bean 工厂对象(ObjectFactory),用于生成AOP代理对象(@Transactional或@Async)。
用户从SpringIOC容器获取一个Bean的底层,会先从一级缓存获取Bean;一级缓存拿不到,从二级缓存获取;二级缓存获取不到从三级缓存获取。
