在使用<component-scan>
自动检测和创建@Controller
bean的上下文配置中,我想避免在控制器属性上使用@Autowired
注释(出于各种原因)我需要/更喜欢显式地注入控制器需要的bean。控制器具有标有@Required
的属性设置器。在这种情况下如何声明要注入控制器的bean?
换句话说:使用<component-scan>
是否必然需要使用@Autowired
,如果不是,如何完成@Required
属性的注入?
顺便说一句,我希望Spring component-scan without autowiring?能回答我的问题,但答案假定“客户”(我的场景中的控制器)没有注释为任何类型的@Component
。
答案 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很好地描述了它们。