为何类可在Spring XML配置中注册为Bean,注解方式却报错?
问题描述
在Spring文档的《Standard and Custom Events》章节中,有通过XML配置注册Bean的示例:
<bean id="blockedListNotifier" class="example.BlockedListNotifier"> <property name="notificationAddress" value="blockedlist@example.org"/> </bean>
尝试用注解方式实现时,出现编译错误:
'@Bean' not applicable to type
对应的注解代码如下:
@Bean public class BlockedListNotifier implements ApplicationListener<BlockedListEvent> { private String notificationAddress; public void setNotificationAddress(String notificationAddress) { this.notificationAddress = notificationAddress; } public void onApplicationEvent(BlockedListEvent event) { // notify appropriate parties via notificationAddress... } }
想请教:
- 出现该错误的原因是什么?
- 是否可以用@Component替代@Bean来实现?
问题解答
错误原因
@Bean注解的作用是标注方法,用来告诉Spring:这个方法会返回一个Bean实例,由Spring接管该实例的生命周期。你直接把它标注在类上,违背了它的使用规范,因此编译器报错提示该注解不适用于类型。
解决方案
方案1:用@Component替代@Bean
完全可以用@Component实现类的Bean注册,这是类级别的Bean注册注解,和XML配置的效果一致:
@Component public class BlockedListNotifier implements ApplicationListener<BlockedListEvent> { @Value("blockedlist@example.org") private String notificationAddress; public void onApplicationEvent(BlockedListEvent event) { // notify appropriate parties via notificationAddress... } }
这里用@Value注解注入notificationAddress的值,对应XML里的<property>配置。只要你的Spring项目开启了组件扫描(比如配置了@ComponentScan注解),Spring就会自动扫描并将这个类注册为Bean。
方案2:正确使用@Bean
如果一定要用@Bean,需要把它放在配置类的方法上,由方法负责创建并返回Bean实例:
@Configuration public class AppConfig { @Bean public BlockedListNotifier blockedListNotifier() { BlockedListNotifier notifier = new BlockedListNotifier(); notifier.setNotificationAddress("blockedlist@example.org"); return notifier; } }
@Configuration标记这是一个Spring配置类,@Bean标注的方法负责实例化BlockedListNotifier并设置属性,Spring会将方法返回的对象作为Bean管理。
内容的提问来源于stack exchange,提问作者K.Nicholas
相关产品推荐
相关产品推荐

