1.什么是IOC
IOC即Inversion of Control(控制反转)的缩写,具体表现为将对象的创建与销毁交由不属于调用方的第三方容器统一集中管理,调用方统一从容器中获取对象,从而降低了调用方与被调用方的耦合度。
优点:1.资源集中管理,实现资源的可配置化
2.资源集中起来更易于管理
3.在调用方与被调用方之间增加了第三方的容器管理资源,降低了二者之间的耦合度
缺点:多了第三方资源管理器的管理,增加了代码的复杂度
2.什么是依赖注入(dependency injection)
依赖资源通过组件的方式从容器中注入当前系统中,从而实现资源的合理有效使用;
3.bean的构建方式有哪些?
- 通过@ComponentScan扫描带有@Component,@Controller,@Service,@Repository等的注解的对象;
- 通过在@Configuration对象中使用@Bean的方式装载bean
- 通过@Import引入对象的方式,此处支持一般对象以及利用ImportSelector和ImportBeanDefinitionRegistrar引入的bean对象
- 通过FactoryBean的getObject()装载bean
4.bean初始化过程中方法的调用次序
- 执行构造方法
- 执行继承的Aware类的方法
- 执行BeanPostProcessor的postProcessBeforeInitialization前置方法
- 执行@PostConstruct方法
- 执行InitializingBean的afterPropertiesSet方法
- 执行BeanPostProcessor的postProcessAfterInitialization后置方法
- 执行@PreDestroy的销毁方法
- 执行DisposableBean的destory方法
5.@Autowired的使用注意:
1. @Autowired是spring提供的默认采用byType的方式注入对象
2.当容器中存在多个相同类型的对象时,@Autowired默认根据注入的属性名称进行bean名称匹配;
3.若对应属性名不存在容器中,而@Autowired又没有显示通过@Qualifier指定bean名称或通过@Primary指定哪个对象为默认bean,则直接抛出错误;
4. 若容器中没有注入的对象bean,但在其他类中通过@Autowired的方式注入该类型的bean,此时会抛出异常,若此时不希望抛出异常可设置required=false,容器中存在多个同类型bean时,required=false的配置无效,仍会抛出错误
5.@Autowired可以与@Qualifier组合使用显示声明通过byname方式注入对象;
6.若不想显示指定通过byname方式注入对象,可以在多个同类型bean中选择一个在bean上添加@Primary注解,当多个对象冲突时,容器默认选择带有@Primary的对象注入;
7. @Autowired支持属性,方法,构造方法,方法参数及注解类型的类中使用,不支持类上使用
6.@Resource的使用注意:
- @Resource是jsr-250默认采用byname方式注入对象的注解
- spring通过CommonAnnotationBeanPostProcessor的后置处理器解析处理@Resource注解的依赖
- @Resource通过type指定的形式指定通过bytype方式注入注解
- @Resource可以同@Inject(需jar依赖引入)组合使用实现类似spring的@Autowired和@Primary的组合功能
- @Resource支持类,属性,方法上进行使用