【问题标题】:Getting Spring object instantiation right正确实现 Spring 对象实例化
【发布时间】:2014-04-08 19:06:58
【问题描述】:

我是 Spring 新手,对它的工作原理有点困惑。我知道我可以使用应用程序上下文来实例化 bean 并填充它们。但是,我是否应该能够只写 Bean b = new Bean() 然后让 Spring 以某种方式自动填充该 Bean?

我正在 Web 应用程序中试验 Spring,据我所知,我需要将 ApplicationContext 注入到 servlet 中,以便能够实例化其他 bean(服务、daos 等)那里。这有点麻烦,但可能有效。

但是,Spring 是否意味着能够挂钩任何对象实例化,这些实例化发生在 applicationContext.xml 中定义为 bean 的类上?

【问题讨论】:

    标签: spring inversion-of-control


    【解决方案1】:

    Spring 是一个控制反转容器。 bean 是一个对象,其生命周期由 Spring 管理。如果你想让 Spring 填充一个对象,它需要通过 Spring,即。它必须是 bean。

    Spring 是否意味着能够挂钩任何对象实例化 发生在 applicationContext.xml 中定义为 bean 的类上?

    Spring 不会与任何东西挂钩。您使用 Spring 配置 bean 以及它们之间的关系,Spring 处理创建实例并将它们链接起来。

    【讨论】:

      【解决方案2】:

      对于域对象,Spring通过@Configurable注解提供了解决方案:http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#aop-atconfigurable

      它需要编译或加载时编织,因此引入了一些额外的复杂性,但在我看来,使用标准 new Bean() 语法加上 Spring 的自动装配的便利是值得的。

      或者,您可以将域对象定义为具有prototype 范围的bean,并使用一些工厂使用Spring ApplicationContext.getBean() 方法创建它们。对于prototype 的范围,每次都会返回一个新实例,并且由于您通过 ApplicationContext,Spring 将像往常一样执行所有依赖注入魔术。

      对于具有singleton 范围的服务和其他bean,您通常不会通过首先注入ApplicationContext 并使用它来检索它们,而是通过构造函数、setter 或基于注释的策略注入它们。文档对此进行了详细介绍:http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-collaborators

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 2022-12-10
        相关资源
        最近更新 更多