【发布时间】:2011-01-28 09:52:53
【问题描述】:
是否可以在不使用组件扫描的情况下使用 @Autowired 注释自动装配 bean?
【问题讨论】:
标签: spring dependency-injection ioc-container autowired
是否可以在不使用组件扫描的情况下使用 @Autowired 注释自动装配 bean?
【问题讨论】:
标签: spring dependency-injection ioc-container autowired
是的。 <context-component-scan .. />负责发现带有@Component、@Controller、@Service、@Respository等注解的bean。
为了处理注释(@Autowired、@Resource 等),您需要 <context:annotation-config />。因此,注释会在 applicationContext.xml 中列出的 bean 上进行处理。
据我所知,<context-component-scan .. /> 会自动激活<context:annotation-config />。
Spring 2.5 和 3.0 都是如此。 (感谢斯卡夫曼)
【讨论】:
我从未尝试过不启用组件扫描,但我可以确认 @Autowire 注释在 Spring 3.0.x 中有效,即使是通过 XML 定义的 bean。
【讨论】:
当使用AnnotationConfigApplicationContext 时,注释配置处理器总是被注册,这意味着在@ComponentScan 级别禁用它们的任何尝试都将被忽略。
【讨论】:
如果问题中的意思是您应该明确说明:
- <context:component-scan ...> 在您的 xml 文件中(它启用 <context:annotation-config />)
或
- @ComponentScan 在你的 java 配置中
那么答案是 - 是的,可以在您的代码或 xml 文件中没有上述任何语句的情况下启用组件扫描。
另一种方法是使用AnnotationConfigApplicationContext:
AnnotationConfigApplicationContext context=
new AnnotationConfigApplicationContext("org.example.your.package");
其中“org.example.your.package”是您的原型注释类的包:@Component、@Repository、@Service 等。 AnnotationConfigApplicationContext 将在基础包和内部包中搜索您的 bean。
【讨论】:
不,如果您使用基于 java 的配置,我们必须使用 @ComponentScan
(或)<context-component-scan .. /> 用于基于 xml 的配置。
注意:如果您没有使用任何方法,则不会在 AplicationContext 中创建相应的实例。
当您尝试访问资源时 (http://localhost:8080/customers) 将结束
警告:未找到包含 URI [/customers] 的 HTTP 请求的映射 DispatcherServlet 名称为 'dispatcher
【讨论】: