IOC是Spring的一个重要功能,Spring维护了一个BeanFactory
去生成和缓存项目运行过程中的对象。这些对象分为用户对象,和上下文对象。
用户对象就是我们自己定义的一些业务、工具类对象。
上下文对象指的是Spring框架在创建过程中的使用的一些上下文对象或者信息,比如BeanFactory
对象本身、BeanName
、ClassLoader
等等。
这些对象或者信息有Spring启动过程中生成并且维护,那么有时候我们需要在业务中使用这些信息,需要让框架主动的将这些信息赋值到我们需要的地方。
Spring提供了Aware
接口来帮助我们实现这件事,并且提供了丰富的Aware
子类配合我们获取上下文对象或信息。
所以Aware
接口就是为了方便我们获取框架上下文对象或信息。
比如BeanFactoryAware
接口
public interface BeanFactoryAware extends Aware {
/**
* Callback that supplies the owning factory to a bean instance.
* <p>Invoked after the population of normal bean properties
* but before an initialization callback such as
* {@link InitializingBean#afterPropertiesSet()} or a custom init-method.
* @param beanFactory owning BeanFactory (never {@code null}).
* The bean can immediately call methods on the factory.
* @throws BeansException in case of initialization errors
* @see BeanInitializationException
*/
void setBeanFactory(BeanFactory beanFactory) throws BeansException;
}
如果我们需要获取BeanFactory
对象,那么只需要实现这个BeanFactoryAware
接口,并且实现对应的setBeanFactory
方法,Spring框架会在启动阶段执行这个方法,将beanFactory
对象传入。这样我们就能拿到这个beanFactory
对象了。
而这个赋值的时机是在框架启动过程中,初始化对象属性时。
-
对象实例化
我们都知道创建Bean过程中首先为对象在内存中开辟一块空间,并且给对象的属性附上默认值。这个过程叫做对象的实例化。实例化后的对象还不能用,因为他还不完整。 -
对象初始化
紧接着我们会执行对象的初始化,首先我们会填充对象属性,调用的是populateBean
方法(这个过程会产生对象的循环依赖问题,因为可能存在有些属性是另外的对象)。
然后调用invokeAwareMethods
方法,为对象注入对应的上下文对象。
后面还有BeanPostProcessor相关方法执行,AOP是在这个阶段完成的,这里不详细列举了。
网友评论