如何在不使用@Autowired?</component-scan>的情况下将<component-scan>用于控制器

时间:2014-08-18 21:13:48

标签: spring

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

换句话说:使用<component-scan>是否必然需要使用@Autowired,如果不是,如何完成@Required属性的注入?

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

我不认为你可以离开组件扫描,同时手动(用XML)连接被组件扫描的bean的依赖关系。

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

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