spring中bean生命周期( 二 )


从的源码我们可以直观的看到其执行过程,而我们记忆其过程便可以从这 4 个阶段出发,实例化、属性赋值、初始化、销毁 。其中细节较多的便是初始化,涉及了 Aware、、、init- 的概念 。这些都是提供的扩展点,其具体作用将在下一节讲述 。
3. 扩展点的作用 3.1 Aware 接口
若检测到 bean 实现了 Aware 接口,则会为其注入相应的依赖 。所以通过让bean 实现 Aware 接口,则能在 bean 中获得相应的容器资源 。
中提供的 Aware 接口有:
:注入当前 bean 对应 ;:注入加载当前 bean 的 ;:注入 当前容器 的引用 。
其代码实现如下:
// AbstractAutowireCapableBeanFactory.javaprivate void invokeAwareMethods(final String beanName, final Object bean) {if (bean instanceof Aware) {if (bean instanceof BeanNameAware) {((BeanNameAware) bean).setBeanName(beanName);}if (bean instanceof BeanClassLoaderAware) {((BeanClassLoaderAware) bean).setBeanClassLoader(bcl);}if (bean instanceof BeanFactoryAware) {((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);}}}
以上是针对类型的容器,而对于类型的容器,也提供了 Aware 接口,只不过这些 Aware 接口的注入实现,是通过的方式注入的,但其作用仍是注入依赖 。
:注入 ,一般用于获取配置属性;:注入 r( EL解析器),一般用于参数解析;are(、、):注入容器本身 。
其代码实现如下:
// ApplicationContextAwareProcessor.javaprivate void invokeAwareInterfaces(Object bean) {if (bean instanceof EnvironmentAware) {((EnvironmentAware)bean).setEnvironment(this.applicationContext.getEnvironment());}if (bean instanceof EmbeddedValueResolverAware) {((EmbeddedValueResolverAware)bean).setEmbeddedValueResolver(this.embeddedValueResolver);}if (bean instanceof ResourceLoaderAware) {((ResourceLoaderAware)bean).setResourceLoader(this.applicationContext);}if (bean instanceof ApplicationEventPublisherAware) {((ApplicationEventPublisherAware)bean).setApplicationEventPublisher(this.applicationContext);}if (bean instanceof MessageSourceAware) {((MessageSourceAware)bean).setMessageSource(this.applicationContext);}if (bean instanceof ApplicationContextAware) {((ApplicationContextAware)bean).setApplicationContext(this.applicationContext);}}
3.2
是为修改 bean提供的强大扩展点,其可作用于容器中所有 bean,其定义如下:
public interface BeanPostProcessor {// 初始化前置处理default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {return bean;}// 初始化后置处理default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {return bean;}}
常用场景有:
对于标记接口的实现类,进行自定义处理 。例如3.1节中所说的,为其注入相应依赖;再举个例子,自定义对实现解密接口的类,将对其属性进行解密处理;为当前对象提供代理实现 。例如AOP 功能,生成对象的代理类,然后返回 。
// AbstractAutoProxyCreator.javapublic Object postProcessBeforeInstantiation(Class beanClass, String beanName) {TargetSource targetSource = getCustomTargetSource(beanClass, beanName);if (targetSource != null) {if (StringUtils.hasLength(beanName)) {this.targetSourcedBeans.add(beanName);}Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);this.proxyTypes.put(cacheKey, proxy.getClass());// 返回代理类return proxy;}return null;}
3.3和 init-
和 init- 是为bean 初始化提供的扩展点 。
接口 的定义如下:
public interface InitializingBean {void afterPropertiesSet() throws Exception;}
在 () 方法写初始化逻辑 。