在Spring Boot中放置@Bean的位置?

我想知道Spring Boot应用程序注册其他bean的最佳位置是什么。 我有一个使用@SpringBootApplication注释的Main类,并且该类中定义的bean被选中。 但是,当我把这些豆子放在另一个class级时,它似乎没有被注册。

在阅读文档时,我认为@SpringBootApplication将隐式搜索其中包含@Bean注释的类。

所以现在我的选择是:

  1. 将所有@Bean注释bean放在我的主类中

     @SpringBootApplication public class MyApplication { @Bean public Filter AuthenticationFilter() { return new AuthenticationFilter(); } public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } } 
  2. 创建配置类并使用@Configuration注释该配置类

     @Configuration public class MyConfiguration { @Bean public Filter AuthenticationFilter() { return new AuthenticationFilter(); } } 

有更好的方法吗?

这几乎是一个偏好问题,但通常认为最好的做法是将暴露的bean放在逻辑上分组的配置类中。

例如,您可能有几个配置类,每个配置类都包含多个bean:一个带有AuthenticationProvider或UserDetailsS​​ervice的bean的身份validation配置类; 一个Thymeleaf配置类,包含各种Thymeleaf方言的bean等。

实际上,你可以选择没有弹簧标准来判断哪一个是最好的但是在定义一个类时OOP设计原则说A类应该是loosely coupledhighly cohesive ,应follow Single Responsibility Principle (SRP) ,这里

Coupling – >一个class级关于另一个class级的知识程度

Cohesion – >度可以说明你的课程有多精确

SRP – >一个class级应该只有一个责任,应该只有一个理由来改变一个class级。

因此,根据凝聚力和SRP原则,课程应该集中精力并且只有一个责任。

在你的情况下,你只有2个豆类,但将来,这些豆类可能会增加。 所以应该遵循你的第二点,为你的bean声明创建另一个类。

在我的选择中甚至应该创建更多的配置类,因此一个配置类应该具有相似类型的bean。

是的,包括@Configuration类中的bean通常是Spring的首选方式。

这也是Spring建议在bean之间注入相互依赖关系的方法之一,如下面的示例所示,这些示例是从Spring的参考指南中复制的:

此外,@ Beans的默认范围是SINGLETON,如果指定不同的范围(如PROTOTYPE),则调用将传递给原始方法。 请参阅Spring参考指南中的这一部分

这取决于个人选择,并没有好的或坏的方式来做到这一点。 因为它是春季启动参考文档中的首选或显示方式。

使用@SpringBootApplication注释主类可以方便地引导spring应用程序。 但它只查找子包,因此在子文件夹中嵌套配置不会自动检测@Bean,这是唯一要记住的事情,而不仅仅是个人偏好。