@Bean
不是把一个class
实例化么?
为什么以下代码可以在方法前加@Bean
?
@Configuration
public class AppConfigWithActiveProfile {
@Bean
public Subject subject(){
Subject subject = new Subject();
subject.setLike("物理");
return subject;
}
}
@Bean
不是把一个class
实例化么?
为什么以下代码可以在方法前加@Bean
?
@Configuration
public class AppConfigWithActiveProfile {
@Bean
public Subject subject(){
Subject subject = new Subject();
subject.setLike("物理");
return subject;
}
}
你好。
我想你的疑惑点是,只有类才能实例化变成一个Bean,所以你认为能把一个类变成Bean的注解只能放在类上,比如常见的@Service、@Configuration
注解,即跟类相关为啥不放在类的旁边。
那么现在我们这样想一下:你能给什么类加@Service等注解呢?
显然,只有你自己写的类你才有编辑的权限。那么如果我要引入第三方jar包,也想其中的一个类注册为Bean呢?
显然,在类上加注解的方法是用不了的(当然你可以使用XML等方式来注册这个Bean,但我们既然已经选择了抛弃xml的方式选择注解,就不要再想着去为这种类额外添加xml配置了)。
所以,有了@Bean
这个注解(同样还有@import
注解),它可以标记在方法上,只要这个方法的返回结果是这个类的实例即可。
当程序启动时,就会扫描到这个注解,去执行这个方法注册一个bean放到容器中,这与放在类上或者xml中的bean配置的注册过程是几乎一样的,只要成功实例化使得容器中有这个Bean了就万事大吉了。
现在回过头来,注解的名字或者放置的位置重要么?其实不重要,因为毋论你放到哪里,只要你的Spring程序能扫描到这个注解,并且能得到你需要实例化的类是谁,你准备怎么实例化就行。xml的配置方式与@Service
注解的方式不也是一样的道理么。
15 回答8.4k 阅读
8 回答6.2k 阅读
4 回答4.4k 阅读✓ 已解决
4 回答4k 阅读
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
2 回答1.5k 阅读✓ 已解决
@Bean
的效果是:把返回值注册成一个bean,bean的名字是方法的名字如果在
@Configuration
的类里,默认会缓存第一次调用的返回值所谓为什么不能加
@Bean