Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring Boot中放@Bean在哪里?_Java_Spring_Spring Boot - Fatal编程技术网

Java 在Spring Boot中放@Bean在哪里?

Java 在Spring Boot中放@Bean在哪里?,java,spring,spring-boot,Java,Spring,Spring Boot,我想知道SpringBoot应用程序注册额外bean的最佳位置是什么。我有一个用@SpringBootApplication注释的主类,该类中定义的bean将被提取。但是当我把这些bean放到另一个类中时,它似乎没有被注册 在阅读文档时,我想到了@springbootplication会隐式搜索包含@Bean注释的类 因此,我现在的选择是: 将所有@Bean带注释的Bean放在我的主类中 @SpringBootApplication public class MyApplication {

我想知道SpringBoot应用程序注册额外bean的最佳位置是什么。我有一个用
@SpringBootApplication
注释的主类,该类中定义的bean将被提取。但是当我把这些bean放到另一个类中时,它似乎没有被注册

在阅读文档时,我想到了
@springbootplication
会隐式搜索包含
@Bean
注释的类

因此,我现在的选择是:

  • 将所有
    @Bean
    带注释的Bean放在我的主类中

    @SpringBootApplication
    public class MyApplication {
    
        @Bean
        public Filter AuthenticationFilter() {
            return new AuthenticationFilter();
        }
    
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    }
    
  • 创建一个配置类并用
    @configuration

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

  • 有更好的方法吗?

    这取决于个人选择,没有好的或坏的方法。 在Spring引导参考的文档中,它是首选或显示方式


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

    这几乎是偏好的问题,但通常认为最好的做法是将公开的bean放在配置类中,配置类是逻辑分组的


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

    实际上,您可以选择,目前没有spring标准来判断哪一个是最好的,但是在定义类时,OOP设计原则说类应该是
    松散耦合的
    高度内聚的
    ,是否应遵循单一责任原则(SRP)
    ,此处

    耦合
    -->一个类对另一个类的了解程度

    内聚性
    -->表明你的班级有多专注的程度

    SRP
    -->一个类应该只有一个职责,更改一个类应该只有一个原因

    所以,根据内聚性和SRP原则,课堂应该是重点突出的,只有一个责任

    在您的例子中,您只有2个bean,但在将来,这些bean可能会增加。因此,您应该遵循第二点,为bean声明创建另一个类


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

    是的,将bean包含在@configuration类中通常是Spring的首选方式

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

    此外,@Beans的默认作用域是SINGLETON,如果指定不同的作用域(如PROTOTYPE),则调用将传递给原始方法。
    请看一下

    中的这一部分,它取决于主类的位置,主类通常有
    @SpringBootApplication
    注释。您可以使用
    @ComponentScan(basePackageClasses=HelloWorld.class)
    注释这个主类。在这里,
    HelloWorld
    @Beans
    注释bean定义,用
    @Configurations
    注释类

    Spring容器将扫描
    @ComponentScan
    参数中指定的类的所有子包。您还可以提供通配符条目而不是类名

    Ex: 
    
    @SpringBootApplication
    @ComponentScan(basePackageClasses = HelloWorld.class)
    public class DemoApplication extends SpringBootServletInitializer {
    
         public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class);
          }
    
    }
    
    **Bean Class:**
    
    @Configuration
    public class HelloWorld {
    
        @Bean
        public TweetUserSevice tweetUserSevice() {
            return new TweetUserSeviceImpl();
        }
    
    }
    

    它取决于主类所在的位置,主类通常具有
    @SpringBootApplication
    注释。您可以使用
    @ComponentScan(basePackageClasses=HelloWorld.class)
    注释这个主类。在这里,
    HelloWorld
    已经用
    @Beans
    注释了定义,而类则用
    @Configurations
    注释。 Spring容器将扫描
    @ComponentScan
    参数中指定的类的所有子包。您还可以为
    basePackageClasses
    参数提供通配符条目,而不是上面指定的类名。例如

    @SpringBootApplication
    @ComponentScan(basePackageClasses = HelloWorld.class)
    public class DemoApplication extends SpringBootServletInitializer {
    
        public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class);
        }
    
    }
    
    Bean类:

    @Configuration
    public class HelloWorld {
    
        @Bean
        public TweetUserSevice tweetUserSevice() {
            return new TweetUserSeviceImpl();
        }      
    }
    
    另一种方法:

    通常在大型项目中,我们会有多个包含bean定义的spring配置类。我们可以避免担心所有bean类都应该在主类的子包中。我们可以做的是,我们可以有一个主spring配置类(但要确保这个主spring配置类位于主类的子包下,以便
    @SpringBootApplication
    注释自动检测主配置)并导入所有其他bean类

    我在包
    com.ronak.tweet
    中有两个bean类(
    tweetbeanconfig
    tweetsystemhealthbeanconfig
    )(这个包不是存在主类的子包)。我有一个主spring配置类(
    TweetMasterSpringConfig
    ),该类驻留在包中,该包是我的主类驻留的子包

    package com.ronak.tweet.beans;
    @Configuration
    @Order(value=1)
    @Import({
        TweetBeansConfig.class,
        TweetSystemHealthBeansConfig.class
    })
    public class TweetMasterSpringConfig {
    
        public TweetMasterSpringConfig() {
            System.out.println("Initilaizing master spring config");
        }
    
    }
    
    package com.ronak.beans;
    @Configuration
    public class TweetBeansConfig {
    
        @Bean
        {
        //
        }
    
    }
    
    package com.ronak.beans;
    @Configuration
    public class TweetSystemHealthBeansConfig {
    
        @Bean
        {
        //
        }
    
    }
    
    
    Main class
    
    package com.ronak.tweet;
    
    @SpringBootApplication
    public class DemoApplication extends SpringBootServletInitializer {
    
          /**This is for registing REST layer for Jersey which implements jaxb. It will register all the classes which is in the pacakage com.ronak.tweet.rest. You can add comma separated package names too.
          @Bean
          ResourceConfig resourceConfig() {
              return new ResourceConfig().packages("com.ronak.tweet.rest");
          }
    
         public static void main(String[] args) {
              SpringApplication.run(DemoApplication.class);
          }
    
    }
    
    看。通常,您会将这些方法放在一个用
    @Configuration
    注释的类中。你为什么认为那不是个好主意?这些文档还讨论了“精简”模式。就是这样做的
    @SpringBootApplication
    是一个方便的注释,其中包括
    @Configuration
    ,因此如果您没有很多bean,可以将它们全部放在那里。如果您有许多bean,并且/或者它们以某种方式进行逻辑分组,那么您可以添加额外的
    @Configuration
    类。但没有“更好”的方法可以做到这一点。