【问题标题】:Automatic dependency injection with Spring使用 Spring 自动进行依赖注入
【发布时间】:2012-01-24 16:04:06
【问题描述】:

我目前使用 CDI (Weld) 和 tomcat 6 作为 servlet-container。在配置中加入 WeldLifecycleListener,进行依赖注入相当简单。

我的问题是:Spring 是否有等效的 WeldLifecycleListener 来避免从 ApplicationContext 实例化 bean?

【问题讨论】:

  • “避开应用程序上下文”是什么意思?

标签: java spring dependencies code-injection


【解决方案1】:

在 Spring 3 中,您可以使用 JSR-330 注释,例如 @Named@Inject(参见 http://blog.springsource.com/2009/09/29/spring-framework-3-0-rc1-released/)。

@Named注解的类会在你通过在spring配置文件中添加以下内容启用组件扫描时自动检测和实例化:

<context:component-scan base-package="${base-package}" />

其中${base-package} 是包含所有组件的包(直接或在子包中)。

【讨论】:

  • 感谢到目前为止的答案,但我的问题不是如何定义 bean(java、xml、annotation)。到目前为止,这没有问题。使用 Spring,我只能在从 applicationContext 获得的 bean 中解决依赖关系。例如以下作品: ctx = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext()); testBean = (TestBean) ctx.getBean("testBean"); testBean 中的依赖关系被正确解析。但是,我不能在不调用 allicationContext 的情况下直接 @Inject testBean。
  • 澄清一下,您有由 CDI 管理的 servlet,但希望 Spring 将依赖项注入其中?我不是 CDI 专家,但我猜你必须选择通过 CDI 或 Spring 来管理它们,否则你将不得不添加自定义代码来获取 Spring 上下文并注入依赖项。
  • 虽然也许如果你添加了@Component@Controller 到你试图注入依赖的类(即你正在编写ctx = WebApplicationContext... 的类)。
【解决方案2】:

我不确定WeldLifecycleListener,但可以指点自动依赖注入

  1. 您可以在 spring 配置文件中使用 Spring beans 中的 autowire 属性。阅读此here
  2. 您还可以使用 @Autowired 注释按类型自动装配,并使用 @Qualifier 连同它一起按名称查找 bean。
  3. @Resource 注解可用于按名称自动装配。

  4. 如果您不想在 Spring 配置中定义任何 bean,请使用组件扫描来自动检测组件并在 bean 上使用注释 @Component - 这 + @Autowire/@Resource 将简化您的配置。

【讨论】:

    猜你喜欢
    • 2011-02-06
    • 2015-03-01
    • 2014-10-27
    • 2011-08-04
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多