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

Mar*_*rco 40 java spring spring-boot

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

在阅读文档时,我意识到@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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建配置类并使用注释进行注释 @Configuration

    @Configuration
    public class MyConfiguration {
        @Bean
        public Filter AuthenticationFilter() {
            return new AuthenticationFilter();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?

Dan*_*one 16

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

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


Nar*_*shi 14

其实,这是你的选择就没有春天标准的现地告诉哪一个是最好的,但在定义一个类OOP的设计原理说,一个类应该是loosely coupledhighly cohesive,宜follow Single Responsibility Principle (SRP),这里

Coupling - >一个班级对另一个班级的知识程度

Cohesion - >学位,表明你的课程有多精确

SRP - >一个班级应该只有一个责任,应该只有一个理由来改变一个班级.

因此,根据凝聚力和SRP原则,课程应该得到很好的关注并且只有一个责任.

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

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


小智 6

是的,通常在Spring中将bean包含在@Configuration类中是首选方法。

这也是春建议注射豆从Spring的参考指南复制下面的示例中显示之间的相互依存关系的方法之一在这里

此外,@ Beans的默认范围是SINGLETON,如果您指定其他范围(例如PROTOTYPE),则调用将传递给原始方法。看一下《Spring Reference Guide》中的这一部分


Mos*_*our 1

这取决于个人选择,没有什么好或坏的方法。因为它是首选或在 Spring Boot 参考文档中显示。

因为用注释主类@SpringBootApplication可以方便 Bootstrap spring 应用程序。但它只查找子包,因此子文件夹内的嵌套配置不会@Bean自动检测,这是除了个人喜好之外唯一要记住的事情。