Spring框架学习[IoC容器高级特性](六)

2014-11-24 03:11:10 · 作者: · 浏览: 7
ateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) {
  • //创建Bean实例对象 ……
  • try { //对Bean属性进行依赖注入
  • populateBean(beanName, mbd, instanceWrapper); if (exposedObject != null) {
  • //在对Bean实例对象生成和依赖注入完成以后,开始对Bean实例对象 //进行初始化 ,为Bean实例对象应用BeanPostProcessor后置处理器
  • exposedObject = initializeBean(beanName, exposedObject, mbd); }
  • } catch (Throwable ex) {
  • if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) { throw (BeanCreationException) ex;
  • } ……
  • //为应用返回所需要的实例对象 return exposedObject;
  • }

    从上面的代码中我们知道,为Bean实例对象添加BeanPostProcessor后置处理器的入口的是initializeBean方法。

    (3).initializeBean方法为容器产生的Bean实例对象添加BeanPostProcessor后置处理器:

    同样在AbstractAutowireCapableBeanFactory类中,initializeBean方法实现为容器创建的Bean实例对象添加BeanPostProcessor后置处理器,源码如下:

    [java]
    1. //初始容器创建的Bean实例对象,为其添加BeanPostProcessor后置处理器 protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    2. //JDK的安全机制验证权限 if (System.getSecurityManager() != null) {
    3. //实现PrivilegedAction接口的匿名内部类 AccessController.doPrivileged(new PrivilegedAction() {
    4. public Object run() { invokeAwareMethods(beanName, bean);
    5. return null; }
    6. }, getAccessControlContext()); }
    7. else { //为Bean实例对象包装相关属性,如名称,类加载器,所属容器等信息
    8. invokeAwareMethods(beanName, bean); }
    9. Object wrappedBean = bean; //对BeanPostProcessor后置处理器的postProcessBeforeInitialization
    10. //回调方法的调用,为Bean实例初始化前做一些处理 if (mbd == null || !mbd.isSynthetic()) {
    11. wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName); }
    12. //调用Bean实例对象初始化的方法,这个初始化方法是在Spring Bean定义配置 //文件中通过init-method属性指定的
    13. try { invokeInitMethods(beanName, wrappedBean, mbd);
    14. } catch (Throwable ex) {
    15. throw new BeanCreationException( (mbd != null mbd.getResourceDescription() : null),
    16. beanName, Invocation of init method failed, ex); }
    17. //对BeanPostProcessor后置处理器的postProcessAfterInitialization //回调方法的调用,为Bean实例初始化之后做一些处理
    18. if (mbd == null || !mbd.isSynthetic()) { wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    19. } return wrappedBean;
    20. } //调用BeanPostProcessor后置处理器实例对象初始化之前的处理方法
    21. public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {
    22. Object result = existingBean; //遍历容器为所创建的Bean添加的所有BeanPostProcessor后置处理器
    23. for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) { //调用Bean实例所有的后置处理中的初始化前处理方法,为Bean实例对象在
    24. //初始化之前做一些自定义的处理操作 result = beanProcessor.postProcessBeforeInitialization(result, beanName);
    25. if (result == null) { return result;
    26. } }
    27. return result; }
    28. //调用BeanPostProcessor后置处理器实例对象初始化之后的处理方法 public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
    29. throws BeansException { Object result = existingBean;
    30. //遍历容器为所创建的Bean添加的所有BeanPostProcessor后置处理器 for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
    31. //调用Bean实例所有的后置处理中的初始化后处理方法,为Bean实例对象在 //初始化之后做一些自定义的处理操作
    32. result = beanProcessor.postProcessAfterInitialization(result, beanName); if (result == null) {
    33. return result; }
    34. } return result;
    35. }

      BeanPostProcessor是一个接口,其初始化前的操作方法和初始化后的操作方法均委托其实现子类来实现,在Spring中,BeanPostProcessor的实现子类非常的多,分别完成不同的操作,如:AOP面向切面编程的注册通知适配器、Bean对象的数据校验、Bean继承属性/方法的合并等等,我们以最简单的AOP切面织入来简单了解其主要的功能。

      (4).AdvisorAdapterRegistration