文章目录
目录
前言
主要介绍了ApplicationContext容器的功能和统一的资源加载策略以及,基于注解的依赖注入。
一、功能
- 在BeanFactory基础上创建的高级Ioc容器,除了可以实现BeanFactory支持的基本功能,还扩展了基本容器的功能,包括BeanFactoryPostProcessor和BeanPostProcessor等容器不同阶段扩展机制,bean实例自动初始化,和容器内事件发布,国际化信息支持等功能
- 默认初始化就绑定完成,启动时间会更长,需要的资源会更多
二、统一的资源加载策略
- 资源加载器
- ResourceLoader
- 资源查找定位策略的统一抽象,其实现类可以实现各种类型资源的查找(classpath、url、filesystem)
- ResourcePatternResoler
- 可以一次定位多个资源
- ResourceLoader
- ApplicationContext的资源加载实现策略
- ApplicationContext实现类继承了ResourPatternResolver,也就间接的继承了ResourceLoader,ApplicationContext就可以当做一个ResourceLoader来使用,实现统一的资源加载策略
- ResourceLoader依赖注入
- 当AplicationContext容器里有一个bean需要依赖一个ResourceLoader,可以直接通过实现ResourceLoaderAware接口,在BeanPostProcessorBeforeInitialization方法里可以对所有实例检查,如果实现了ResourceLoader接口,就会将ApplicationContext容器本身注入到当前对象中
- Resource依赖注入
- Resource代表的资源是某一个bean的属性的值,但是这种特殊的资源类型没有默认的PropertyEditor实现类型转换
- ApplicationContext容器在启动阶段会通过ResourceEditorRegistry注册一个ResourceEditor,可以自动识别Resource类型并转换,无需我们自定义PropertyEditor加入容器
- 如果我们需要注册很多个ResourceEditor,可以通过配置告诉CustomEditorConfigurer即可
三、基于注解的依赖注入
- Spring提供的依赖注入
- 容器里注入AutowiredAnnotationBeanPostProcessor,在bean实例化阶段会在BeanPostProcessorBeforeInitialization方法对所有实例对象进行处理,通过反射拿到整个类的信息,然后看看哪里标注了@Autowired /@Qulifier 注解,对标注了该注解的属性、构造方法或者方法定义进行依赖注入
- @Autowired
- bytype类型的自动依赖注入
- 在需要进行依赖注入的bean的属性property,构造方法cunstructor,普通方法(setter/method)上标注一个@Autowired 注解容器会帮助我们自动进行依赖注入
- @Qulifier
- byname类型的自动依赖注入
- 如果@Autowired 注解需要注入的类型有多个bean定义会出错,可以通过@Qulifier("bean-idname") 指定需要注入的到底是哪一个bean
- JSR250标注依赖注入
- 容器里注入CommonAnnotationBeanPostProcessor,在bean实例化阶段会在BeanPostProcessorBeforeInitialization方法对所有实例对象进行处理,通过反射拿到整个类的信息,然后看看哪里标注了@Resource / @PostConstruct / @PreDestroy 注解,对标注了该注解的属性、构造方法或者方法定义进行依赖注入
- @Resource(name="bean-idname")
- byname类型的依赖注入,可以为属性、构造方法、普通方法注入bean-idname的依赖
- 对象生命周期管理
- 和配置xml文件里的InitializingBean和init-method或者DisposableBean和destroy-method有相同功能
- @PostConstruct
- 对标InitializingBean和init-method,做对象投入使用之前的处理
- @PreDestroy
- 对标DisposableBean和destroy-method,指定对象使用完成后的自定义销毁策略
- classpath-scanning
- 通过配置文件里配置<context:component-scan base-package="xxx"/>可以扫描base-package下的所有类型定义,寻找标注了注解的@component ( @Respository /@Service / @Controller) 对象加入到容器中
- @Respository /@Service / @Controller 是对@component 的细分,功能一样,只不过可以帮我们更好的分层,@component 可以进行自定义的bean-idname命名
- 通过classpath-scanning,无需再向配置文件里写入bean定义,通过扫描包下所有类型定义信息找到注解拿到类的信息然后记录到BeanDefinition
- <context:classpath-scan>中的annotation-config属性值为true时,会自动帮我们将AutowiredAnnotationBeanPostProcessor和CommonAnnotationBeanPostProcessor注入到容器里,实现基于注解的自动的依赖注入