@Autowired
是否可以在不使用组件扫描的情况下使用注释自动装配 bean ?
5 回答
是的。<context-component-scan .. />
负责发现用@Component
, @Controller
, @Service
,@Respository
等注释的 bean。
为了处理注释(@Autowired
,@Resource
等),您需要<context:annotation-config />
. 因此,注释在列出的 bean 上进行处理applicationContext.xml
。
据我所知,自动<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 />
)
或
- 在你的 java 配置中的 @ComponentScan
那么答案是 - 是的,可以在您的代码或 xml 文件中没有上述任何语句的情况下启用组件扫描。
另一种方法是使用AnnotationConfigApplicationContext
:
AnnotationConfigApplicationContext context=
new AnnotationConfigApplicationContext("org.example.your.package");
其中“org.example.your.package”是您的原型注释类的包:@Component、@Repository、@Service 等。AnnotationConfigApplicationContext 将在基础包和内部包中搜索您的 bean。
@ComponentScan
不,如果您使用基于 java 的配置(或)<context-component-scan .. />
基于 xml 的配置,我们必须使用。
注意:如果您不使用任何方法,则不会在 AplicationContext 中创建相应的实例。
当您尝试访问资源(http://localhost:8080/customers)时,最终会得到
警告:在名称为“dispatcher”的 DispatcherServlet 中找不到带有 URI [/customers] 的 HTTP 请求的映射