前言
从前,我对@Configuration
注解的认识是,使用了该注解的类就会被当做配置类,大家可以在类中对一些框架或者系统中的功能进行一些配置。
但当你问我那为什么不用@Component
呢?我估计只能回答:大概是这个更具有标明性吧…
今天看了一篇优秀的博客让我对这个注解有了新的认识冲动。博客地址
代码尝试
我尝试了下两个bean调用的时候出现的情况
在@Configuration
标注的类的情况下:
根据以往的结论应该☝️有两个nice输出,但执行结果显示只执行了一次nice的方法
在@Component标注时
执行结果如预期的显示了两次
本文使用的是springboot2.1.7
的版本@Configuration
中只有一个value参数。
所以@Configuration
使用后和仅@Component
修改的明显区别是,前者是把bean依托于Spring进行管理,在Spring中bean默认是单例的,及时出现这样的调用也会返回已创建好的bean给调用者而不是重新创建一个。
通过改注解的注释,我们也可以了解到一些有用的官方信息
注释说明了本注解主要用来为Spring容器在运行的适合声明一些bean。并且也说明了bean如何进行延迟加载使用@Lazy,也说明了使用@Profile的方法。
死机小技巧
如果在bean中循环调用其他bean那就会产生一些美妙的事情
@Configuration
public class InitConfig {
@Bean
public String success(){
System.out.println("success");
return nice();
}
@Bean
public String nice(){
System.out.println("nice");
return ok();
}
@Bean
public String ok(){
System.out.println("ok");
return success();
}
}
这个循环调用可和循环依赖没有什么关系。Spring可以解决循环依赖,但是这个可是死循环,必然无解,在程序启动时就会报错*_*。
小结
总结下:我们知道在@Configuration
声明的类中可以使用@Bean
来声明一个配置源。但是当我们在其他的带@Component
标注的如@Service
和@Controller
声明的类时,也是可以声明的,只是@bean方法在互相调用的时候不会从容器中获取了。 所以使用@Configuration
向Spring提供bean才是正确的打开方式。