Spring面试题大全
目录
文档索引
官方文档:Spring Framework Documentation
面试题汇总
Q:Bean的生命周期?
A:
Bean的生命周期主要有四步,注册Bean,实例化Bean,初始化Bean,销毁Bean
一、注册Bean
- 根据定义的Bean,生成BeanDefinition并放入BeanDefinitionMap中
二、实例化Bean
- 调用BeanFactoryPostProcessors,常见的PropertySourcesPlaceholderConfigurer用于解析配置
- 调用InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation,生成bean后返回,常见的AbstractAutoProxyCreator,用于返回代理类
- 实例化bean
- 调用MergedBeanDefinitionPostProcessor,常见的CommonAnnotationBeanPostProcessor,AutowiredAnnotationBeanPostProcessor用于对注解扫描注册
- 调用InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation bean实例化后的后置修饰
三、初始化Bean
- 调用InstantiationAwareBeanPostProcessor的postProcessPropertyValues对属性进行设置
- BeanNameAware、BeanClassLoaderAware、BeanFactoryAware用于暴露容器
- 调用postProcessBeforeInitialization对bean进行设置后返回
- 继承InitializingBean,执行afterPropertiesSet方法
- 调用init方法
- 调用postProcessAfterInitialization
- 所有bean初始化完后,调用SmartInitializingSingleton的afterSingletonsInstantiated方法
四、销毁Bean
- DiposibleBean的destroy方法
- bean的destroy-method方法
Q:Bean如何进行定义和注册?
A:
Bean可以在XML或Java文件中进行定义注册
- ClassPathXmlApplicationContext扫描xml下的<bean>
- ClassPathXmlApplicationContext通过xml的context:component-scan或@ComponentScan扫描被@Controller、@Service、@Repository、@Component注解的类
- 利用AnnotationConfigApplicationContext扫描@Configuration下的@Bean
- 通过@Import引入ImportBeanDefinitionRegistrar实现
- 通过refresh,利用context的registerBeanDefinition方法
- 利用context的registerBean方法定义Supplier接口
Q:Bean如何进行实例化?
A:
通过以下四种方法,可以对Bean进行实例化
- 构造方法
- 静态工厂
- 实例工厂
- instanceSupplier方法进行实例化
Q:Bean如何进行依赖注入?
A:
XML
- 构造方法:不可变、不产生npe问题
- setter注入:定制化
- autowire属性注入:byName、byType、constructor,不需要填写bean之间的依赖,自动装配
注解
- @Autowired注解在set方法上,使用byType,如有多个,则根据参数byName
- @Autowired注解在构造方法上,使用改constructor,如果只有一个,或有默认构造,则没有注解的情况,直接使用该构造
- @Autowired注解在字段上,默认以byType方式去匹配,如果没找到,以byName方式去查找
- @Resource:默认以byName方式去匹配,没找到则以byType方式招到,如果有多个,使用@Qualifier直接指定
Q:循环依赖是什么?Spring如何解决循环依赖?
A:解决方案:Spring循环依赖问题解决方案