spring的对象管理

spring中的循环依赖

循环依赖 ,即一个类依赖了另一个类,但是另一个类又依赖第一个类
处理循环依赖关键是看第一个类依赖的类是什么作用域,以及是什么方式注入的

  1. 如果依赖的类是原型作用域,无法进行依赖注入,因为容器不会管理原型作用域的对象,自然也不会用来注入(注入之前必须要先能在容器中找到)
  2. 依赖的类是单例作用域,且是构造器方式中注入依赖,则会抛出异常
  3. 如果是setter方式注入依赖,则可以循环依赖,只需要将第二个类的注入和后续初始化在第一个类初始化完成之后调用即可

关于bean的生命周期

以下为BeanFactory注释原文javadoc
Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:

  1. BeanNameAware’s setBeanName

  2. BeanClassLoaderAware’s setBeanClassLoader

  3. BeanFactoryAware’s setBeanFactory

  4. EnvironmentAware’s setEnvironment

  5. EmbeddedValueResolverAware’s setEmbeddedValueResolver

  6. ResourceLoaderAware’s setResourceLoader (only applicable when
    running in an application context)

  7. ApplicationEventPublisherAware’s setApplicationEventPublisher (only applicable when running in an application context)

  8. MessageSourceAware’s setMessageSource (only applicable when running in an application context)

  9. ApplicationContextAware’s setApplicationContext (only applicable
    when running in an application context)

  10. ServletContextAware’s setServletContext (only applicable when running in a web application context)

  11. postProcessBeforeInitialization methods of BeanPostProcessors

  12. InitializingBean’s afterPropertiesSet

  13. a custom init-method definition

  14. postProcessAfterInitialization methods of BeanPostProcessors

On shutdown of a bean factory, the following lifecycle methods apply:

  1. postProcessBeforeDestruction methods of DestructionAwareBeanPostProcessors
  2. DisposableBean’s destroy
  3. a custom destroy-method definition

可以总结如下
一个bean先是直接构造和设值注入
然后为在容器中为对应的BeanDefinition注册名字, 绑定各种关联的环境
然后就是容器中的BeanPostProcessors(另外一些bean)的初始化前置处理
如果bean自身实现了InitializingBean,会调用afterPropertiesSet()
再来是自定义的init方法
BeanPostProcessor的初始化后置处理

销毁的时候是
容器中的DestructionAwareBeanPostProcessors的销毁前置处理方法
如果bean自身实现了DisposableBean,会调用destroy
最后是自定义的destroy方法

基本流程与一个普通对象的实例化是一致的,
就是初始化时调用构造方法,设值注入,init方法
销毁时调用destroy方法

其他的增强功能还有对象自己实现的接口InitializingBean和DisposableBean
和容器中与之对应的BeanPostProcessor和DestructionAwareBeanPostProcessor的处理参与

FactoryBean

BeanFactory是容器,而FactoryBean是用来产生bean的bean
既然容器本身就有产生bean的能力,那为什么还要用FactoryBean来产生bean呢?
答案是FactoryBean是可以实现对某一类对象的初始化的代理(也就是工厂方法本身的用处)
FactoryBean接口定义的方法如下

T getObject()
Class<?> getObjectType()
boolean isSingleton()

容器BeanFactory通过反射来实例化对象
当调用BeanFactory的getBean方法时, 如果有对应的FactoryBean(也就是Class和FactoryBean的getObjectType()相同,且满足相同作用域时),会调用FactoryBean的getObject()方法

这意味着在实际对象构造时可以在getObject()方法中加一层代理

实际上通过xml配置factory-method创建bean也就是实现了 FactoryBean

一些接口的用处

InitializingBean

void afterPropertiesSet() throws Exception

可以用来注入一些不需要spring容器管理的依赖的值,比如一个string(在纯粹使用注解和自动注入依赖的场景下能做一些补充),也可以用来做一些日志之类的处理
通过xml配置init-method也就是实现了InitializingBean,destroy-method同理
注解@PostConstruct和@PreDestroy的处理和InitializingBean类似,可以混用

BeanPostProcessor

Object postProcessBeforeInitialization(Object bean,
                                       String beanName)
                                       throws BeansException
                                       
Object postProcessAfterInitialization(Object bean,
                                      String beanName)
                                      throws BeansException                                       

这个接口的用处很广泛,因为该接口的处理针对的是所有容器创建的bean,能够获取bean的实例和beanName,可以筛选一些beanName做特殊处理,也可以实现像是自动检测@Autowired,@Componet这样的注解并处理的功能

spring内部的很多注解处理类都实现了该接口

总结

spring的Ioc容器实际上是集中和强化了对对象的生命周期的管理,并提供了多种方式为对象的创建和销毁提供了增强功能
其创建流程也保证了依赖注入的安全性

另一个核心功能AOP,可以看作是提供了方法调用的增强功能

整个spring的核心目的是增加对象的可管理性,以及提供对任意位置的功能增强的接口

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值