Spring-Ioc-ApplicationContext&注解

文章目录

目录

文章目录

前言

一、功能

二、统一的资源加载策略

三、基于注解的依赖注入

总结


前言

主要介绍了ApplicationContext容器的功能和统一的资源加载策略以及,基于注解的依赖注入。


一、功能

  • 在BeanFactory基础上创建的高级Ioc容器,除了可以实现BeanFactory支持的基本功能,还扩展了基本容器的功能,包括BeanFactoryPostProcessor和BeanPostProcessor等容器不同阶段扩展机制,bean实例自动初始化,和容器内事件发布,国际化信息支持等功能
  • 默认初始化就绑定完成,启动时间会更长,需要的资源会更多

二、统一的资源加载策略

  • 资源加载器
    • ResourceLoader
      • 资源查找定位策略的统一抽象,其实现类可以实现各种类型资源的查找(classpath、url、filesystem)
    • ResourcePatternResoler
      • 可以一次定位多个资源
  • 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注入到容器里,实现基于注解的自动的依赖注入

总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值