为了账号安全,请及时绑定邮箱和手机立即绑定

BeanFactory与ApplicationContext

/ 猿问

BeanFactory与ApplicationContext

慕仰1329654 2019-08-14 16:49:50

BeanFactory与ApplicationContext

我是Spring Framework的新手,我一直在玩它并将一些示例应用程序放在一起,以便评估Spring MVC用于即将到来的公司项目。到目前为止,我非常喜欢我在Spring MVC中看到的内容,看起来非常容易使用,并鼓励您编写非常适合单元测试的类。

就像练习一样,我正在为我的一个示例/测试项目编写一个主要方法。我不清楚的一件事是BeanFactory和之间的确切差异ApplicationContext- 适合在哪些条件下使用?

我理解ApplicationContext扩展BeanFactory,但如果我只是编写一个简单的主方法,我是否需要ApplicationContext提供额外的功能?究竟是什么类型的额外功能ApplicationContext提供了?

除了回答“我应该在main()方法中使用哪个”之外,对于在这种情况下我应该使用哪种实现,是否有任何标准或指南?我的main()方法是否应该依赖于bean /应用程序配置以XML格式编写 - 这是一个安全的假设,还是我将用户锁定为特定的东西?

这个答案是否会在网络环境中发生变化 - 如果我的任何课程需要了解Spring,他们是否更有可能需要ApplicationContext

谢谢你的帮助。我知道很多这些问题可能在参考手册中得到了解答,但是我很难找到这两个界面的明确细分以及每个界面的优点/缺点而不通过精细梳齿阅读手册。


查看完整描述

3 回答

?
达令说

春季文档很棒:3.8.1。BeanFactory或ApplicationContext?。他们有一个比较表,我将发布一个片段:

豆厂

  • Bean实例化/布线

应用背景

  • Bean实例化/布线

  • 自动BeanPostProcessor注册

  • 自动BeanFactoryPostProcessor注册

  • 方便的MessageSource访问(适用于i18n)

  • ApplicationEvent出版物

因此,如果您需要在应用程序上下文方面提供的任何要点,则应使用ApplicationContext。


查看完整回答
反对 回复 2019-08-14
?
喵喵时光机

对我来说,最主要的区别,选择BeanFactoryApplicationContext似乎是ApplicationContext将预先初始化所有的豆类。从春天文档

当实际创建bean时,Spring会尽可能晚地设置属性并解析依赖关系。这意味着,如果在创建该对象或其某个依赖项时出现问题,则在请求对象时,正确加载的Spring容器可以在以后生成异常。例如,bean因缺少属性或无效属性而抛出异常。这可能会延迟一些配置问题的可见性,这就是默认情况下ApplicationContext实现预先实例化单例bean的原因。以实际需要之前创建这些bean的一些前期时间和内存为代价,您会在创建ApplicationContext时发现配置问题,而不是以后。您仍然可以覆盖此默认行为,以便单例bean将延迟初始化,而不是预先实例化。

鉴于此,我最初选择BeanFactory用于集成/性能测试,因为我不想加载整个应用程序来测试隔离的bean。但是 - 如果我错了,有人会纠正我 - BeanFactory不支持classpathXML配置。所以BeanFactoryApplicationContext每个都提供了我想要的关键功能,但两者都没有。

我可以说,文档中关于覆盖默认实例化行为的注释发生在配置中,并且它是每个bean,所以我不能只在XML文件中设置“lazy-init”属性或者我是坚持维护它的一个版本用于测试,一个用于部署。

我最终做的是扩展ClassPathXmlApplicationContext到懒惰加载bean以便在如下的测试中使用:

public class LazyLoadingXmlApplicationContext extends ClassPathXmlApplicationContext {

    public LazyLoadingXmlApplicationContext(String[] configLocations) {
        super(configLocations);
    }

    /**
     * Upon loading bean definitions, force beans to be lazy-initialized.
     * @see org.springframework.context.support.AbstractXmlApplicationContext#loadBeanDefinitions(org.springframework.beans.factory.xml.XmlBeanDefinitionReader)
     */

    @Override
    protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws IOException {
        super.loadBeanDefinitions(reader);
        for (String name: reader.getBeanFactory().getBeanDefinitionNames()) {
            AbstractBeanDefinition beanDefinition = (AbstractBeanDefinition) reader.getBeanFactory().getBeanDefinition(name);
            beanDefinition.setLazyInit(true);
        }
    }}


查看完整回答
反对 回复 2019-08-14
?
BIG阳

Spring提供了两种IOC容器,一种是XMLBeanFactory其他的ApplicationContext。


+---------------------------------------+-----------------+--------------------------------+

|                                       | BeanFactory     |       ApplicationContext       |

+---------------------------------------+-----------------+--------------------------------+

| Annotation support                    | No              | Yes                            |

| BeanPostProcessor Registration        | Manual          | Automatic                      |

| implementation                        | XMLBeanFactory  | ClassPath/FileSystem/WebXmlApplicationContext|

| internationalization                  | No              | Yes                            |

| Enterprise services                   | No              | Yes                            |

| ApplicationEvent publication          | No              | Yes                            |

+---------------------------------------+-----------------+--------------------------------+

https://img3.mukewang.com/5d53cb600001983803360478.jpg

  • FileSystemXmlApplicationContext 豆通过完整的路径加载。

  • ClassPathXmlApplicationContext 通过CLASSPATH加载的Bean

  • XMLWebApplicationContextAnnotationConfigWebApplicationContextbean通过Web应用程序上下文加载。

  • AnnotationConfigApplicationContext 从基于Annotation的配置加载Spring bean。

例:

  ApplicationContext applicationContext = new AnnotationConfigApplicationContext(BeansConfiguration.class);
  • ApplicationContext是由初始化的容器ContextLoaderListenerContextLoaderServlet以限定的web.xmlContextLoaderPlugin所限定struts-config.xml

XmlBeanFactory弃用赞成作为春季3.1 DefaultListableBeanFactoryXmlBeanDefinitionReader


查看完整回答
反对 回复 2019-08-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信