使Spring对象实例化正确

时间:2014-04-08 19:06:58

标签: spring inversion-of-control

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

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

但是,Spring是否能够挂接到在applicationContext.xml中定义为bean的类上发生的任何对象实例化?

2 个答案:

答案 0 :(得分:1)

Spring是一个Inversion of Control容器。 bean是一个生命周期由Spring管理的对象。如果你想让Spring填充一个对象,它需要通过Spring,即。它需要是豆。

  

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

Spring并没有挂钩。您可以使用Spring和Spring处理bean以及它们之间的关系来创建实例并将它们链接起来。

答案 1 :(得分:0)

对于域对象,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并使用它来检索它们,而是通过构造函数,设置器或注释注入它们 - 基于策略。该文档详细介绍了这些内容:http://docs.spring.io/spring/docs/4.0.0.RELEASE/spring-framework-reference/htmlsingle/#beans-factory-collaborators