@Bean注解为什么可以修饰方法?

@Bean不是把一个class实例化么?

为什么以下代码可以在方法前加@Bean?

@Configuration
public class AppConfigWithActiveProfile {

    @Bean
    public Subject subject(){
        Subject subject = new Subject();
        subject.setLike("物理");
        return subject;
    }

}
阅读 4.1k
2 个回答

@Bean的效果是:把返回值注册成一个bean,bean的名字是方法的名字
如果在 @Configuration 的类里,默认会缓存第一次调用的返回值
所谓为什么不能加@Bean

你好。
我想你的疑惑点是,只有类才能实例化变成一个Bean,所以你认为能把一个类变成Bean的注解只能放在类上,比如常见的@Service、@Configuration注解,即跟类相关为啥不放在类的旁边。

那么现在我们这样想一下:你能给什么类加@Service等注解呢?
显然,只有你自己写的类你才有编辑的权限。那么如果我要引入第三方jar包,也想其中的一个类注册为Bean呢?
显然,在类上加注解的方法是用不了的(当然你可以使用XML等方式来注册这个Bean,但我们既然已经选择了抛弃xml的方式选择注解,就不要再想着去为这种类额外添加xml配置了)。

所以,有了@Bean这个注解(同样还有@import注解),它可以标记在方法上,只要这个方法的返回结果是这个类的实例即可。

当程序启动时,就会扫描到这个注解,去执行这个方法注册一个bean放到容器中,这与放在类上或者xml中的bean配置的注册过程是几乎一样的,只要成功实例化使得容器中有这个Bean了就万事大吉了。

现在回过头来,注解的名字或者放置的位置重要么?其实不重要,因为毋论你放到哪里,只要你的Spring程序能扫描到这个注解,并且能得到你需要实例化的类是谁,你准备怎么实例化就行。xml的配置方式与@Service注解的方式不也是一样的道理么。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题