BeanFactory容器之AutowireCapableBeanFactory、HierarchicalBeanFactory、ListableBeanFactory

一、AutowireCapableBeanFactory:提供了自动装配Bean的实现,提供bean创建(带有构造函数解析)、属性填充、连接(包括自动装配)和初始化。处理运行时bean引用、解析托管集合、调用初始化方法等。支持自动装配构造函数、按名称的属性和按类型的属性。

其通过实现类AbstractAutowireCapableBeanFactory 实现bean的创建,对应源码:

进一步查看createBean():

    protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
        if (logger.isDebugEnabled()) {
            logger.debug("Creating instance of bean '" + beanName + "'");
        }
        RootBeanDefinition mbdToUse = mbd;

        // Make sure bean class is actually resolved at this point, and
        // clone the bean definition in case of a dynamically resolved Class
        // which cannot be stored in the shared merged bean definition.
        Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
        if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
            mbdToUse = new RootBeanDefinition(mbd);
            mbdToUse.setBeanClass(resolvedClass);
        }

        // Prepare method overrides.
        try {
            mbdToUse.prepareMethodOverrides();
        }
        catch (BeanDefinitionValidationException ex) {
            throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
                    beanName, "Validation of method overrides failed", ex);
        }

        try {
            // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
            Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
            if (bean != null) {
                return bean;
            }
        }
        catch (Throwable ex) {
            throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
                    "BeanPostProcessor before instantiation of bean failed", ex);
        }

        Object beanInstance = doCreateBean(beanName, mbdToUse, args);-----执行创建Bean
        if (logger.isDebugEnabled()) {
            logger.debug("Finished creating instance of bean '" + beanName + "'");
        }
        return beanInstance;
    }

doCreateBean():创建bean实例

        // Initialize the bean instance.
        Object exposedObject = bean;
        try {
            populateBean(beanName, mbd, instanceWrapper);----用bean定义中的属性值填充给定BeanWrapper中的bean实例。
            if (exposedObject != null) {
                exposedObject = initializeBean(beanName, exposedObject, mbd);---初始化给定的bean实例,应用工厂回调以及init方法和bean后处理器。
            }
        }

二、HierarchicalBeanFactory:该子接口由bean工厂实现的子接口可以是层次结构的一部分。bean工厂的相应setParentBeanFactory方法允许以可配置的方式设置父类,可以在ConfigurableBeanFactory接口中找到。

三、ListableBeanFactory

      bean工厂将实现BeanFactory接口的扩展,这些bean工厂可以枚举它们的所有bean实例,而不是按照客户机的请求逐个尝试bean查找。预加载所有bean定义(例如基于xml的工厂)的BeanFactory实现可以实现此接口。可以通过xml去获取bean。其实现类StaticListableBeanFactory提供了通过不同条件获取bean的方法。getBean(String name)、getBean(String name, Class<T> requiredType)、getBean(Class<T> requiredType)等。

BeanFactory工厂实现应该尽可能支持标准Bean生命周期接口。全套初始化方法及其标准顺序为:

1.BeanNameAware  setBeanName

2.BeanClassLoaderAware  setBeanClassLoader

3.BeanFactoryAware  setBeanFactory

4.EnvironmentAware  setEnvironment

5.EmbeddedValueResolverAware  setEmbeddedValueResolver

6.ResourceLoaderAware  setResourceLoader(仅适用于在应用程序上下文中运行时)

7.ApplicationEventPublisherAware   setApplicationEventPublisher(仅适用于在应用程序上下文中运行时)

8.MessageSourceAware  setMessageSource(仅适用于在应用程序上下文中运行时)

9.applicationcontext - ware   setApplicationContext(仅适用于在应用程序上下文中运行时)

10.servletcontext(仅适用于在web应用程序上下文中运行时)

11.beanpostprocessor 初始化方法之前的后处理

12.InitializingBean  afterPropertiesSet

13.一个自定义的init-method定义

14.beanpostprocessor 处理后初始化方法

在关闭bean工厂时,应用以下生命周期方法:

1.析构的后处理方法

2.DisposableBean的破坏

3.自定义销毁方法定义

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值