【问题标题】:How to use <component-scan> for controllers without using @Autowired?如何在不使用@Autowired 的情况下将 <component-scan> 用于控制器?
【发布时间】:2014-08-18 21:13:47
【问题描述】:

在使用&lt;component-scan&gt; 自动检测和创建@Controller bean 的上下文配置中,我想避免在控制器属性上使用@Autowired 注释(出于各种原因,我需要/更喜欢显式注入控制器需要的bean)。控制器具有标记为@Required 的属性设置器。在这种情况下,如何声明要注入控制器的 bean?

换句话说:使用&lt;component-scan&gt;是否一定需要使用@Autowired,如果不是,如何完成@Required属性的注入?

顺便说一句,我希望 Spring component-scan without autowiring? 能回答我的问题,但答案假定“客户端”(我的场景中的控制器)本身没有被注释为任何类型的 @Component

【问题讨论】:

  • “手动注入”是什么意思?构造函数和字段注入不会做你需要的吗?
  • 避免自动装配的唯一方法是通过构造函数/设置器注入使用 Spring Context 文件 xml。
  • 据我了解,您希望作为@Controller 扫描的结果创建实例,但同时您希望在控制器上使用&lt;property name="whatever" ref="someWhateverInstance" /&gt;。我不认为这是可能的。你不喜欢 @Autowired 或任何其他形式的自动装配(在注入依赖项时意味着 Java 配置)?
  • 如果您提供有关“出于各种原因我需要/更喜欢显式注入控制器需要的 bean”的更多详细信息,我相信 Spring 会提供一些适合您的解决方案无 xml(并带有 Java 配置)。例如,您可以使用@Qualifier@Resource 而不是@Autowired
  • 我一般不喜欢自动装配,但对在这里的宗教辩论不感兴趣。可以这么说,在我现在谈论的特定场景中,通过&lt;component-scan&gt; 发现了很多控制器(和其他组件),完全放弃它将是一项很大的工作。我正在寻找一种解决方案,可以让我有选择地从其中一组中删除自动装配。 (不幸的是,我想要这样做的那些并不都在同一个包中)。

标签: spring


【解决方案1】:

在您的情况下,您可以逐渐远离组件扫描,方法是使用注释过滤器排除您想要手动连接的控制器。例如,您可以定义一个 @NotAutowired 注释来标记您想要排除的控制器。然后定义组件扫描排除过滤器:

@ComponentScan(basePackages = {"app.controller"},
               excludeFilters = @ComponentScan.Filter(
                          value= NotAutowired.class, 
                          type = FilterType.ANNOTATION)
)

或者您可以简单地将控制器移动到另一个包中。

【讨论】:

  • 这对我的特殊情况来说是个好主意。如果 SO 允许我,我会接受这两个答案,但我不能。我认为另一个答案在更一般地解释情况方面做得更好,并且包括对组件扫描过滤器文档的参考。实际上,我可能会针对我的特定情况使用此答案中的代码。
  • 我同意。 @AndreiStefan 回答和 cmets 实际上解释了问题,我只是添加了一个特定的解决方案。
【解决方案2】:

我认为您不能在组件扫描中离开,同时手动(在 XML 中)连接被组件扫描的 bean 的依赖项。

如果你使用组件扫描,你告诉 Spring 创建 bean 实例。如果你在 xml 中定义一个 bean,你告诉 Spring 创建 bean 实例。如果您以两种方式执行此操作,您将获得两个 bean 实例。您想要的是 Spring 在看到 @Controller 注释时创建 bean,然后转到 xml 并查看它具有哪些依赖项。那么,如果您仍然最终在 xml 中使用该 bean 做某事,那么首先进行组件扫描有什么意义呢?!

如果您想要选择性的组件扫描(这与仅自动装配相比是另一回事),那么您的选择就很少了。参考文档中的This section 很好地描述了它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多