2015-03-19 5 views
22

Мне интересно, какое лучшее место для приложения Spring Boot зарегистрировать дополнительные бобы. У меня есть класс Main, который аннотируется с @SpringBootApplication, и боны, определенные в этом классе, подбираются. Но когда я помещаю эти бобы в другой класс, кажется, что они не регистрируются.Где положить @Bean весной Boot?

При чтении документации я понял, что @SpringBootApplication будет неявно искать классы, в которых есть аннотации @Bean.

Так что мои варианты теперь:

  1. Поместите все @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(); 
        } 
    } 
    

Есть ли лучший способ сделать это?

+3

См. [API-документы '@ Bean'] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context /annotation/Bean.html). Обычно вы помещаете эти методы в класс, который аннотируется с помощью '@ Configuration'. Почему вы думаете, что это не очень хорошая идея? В документах также говорится о режиме «Lite». – Jesper

+9

2. это способ для этого. '@ SpringBootApplication' - удобная аннотация, включающая' @ Configuration', поэтому, если у вас нет большого количества бобов, вы можете разместить их там. Если у вас много бобов и/или они как-то логически группируются, вы можете добавить дополнительные классы '@ Configuration'. Но нет «лучшего» способа сделать это. –

ответ

1

Это зависит от личного выбора, и нет хорошего или плохого способа сделать это. Как это предпочтено или показано способом в документации ссылок на весеннюю загрузку.

Как аннотировать основной класс с помощью @SpringBootApplication, это удобно для загрузки весеннего приложения. Но он ищет только подпакеты, поэтому вложенная конфигурация внутри подпапки не будет автоматически обнаруживать @Bean, это единственное, что нужно запомнить, кроме того, что все зависит от личных предпочтений.

9

Это в значительной степени зависит от предпочтения, но, как правило, считается, что наилучшая практика заключается в том, чтобы положить выставленные бобы в классы конфигурации, которые логически сгруппированы.

Например, у вас может быть несколько классов конфигурации с несколькими компонентами, содержащимися в каждом из них: класс конфигурации аутентификации с компонентами для AuthenticationProvider или UserDetailsService; класс конфигурации Тимелеафа, содержащий бобы для различных диалектов Тимелеафа и т. д.

5

На самом деле, это ваш выбор, нет весеннего стандарта, чтобы рассказать, какой из них лучше, но при определении принципов дизайна ООП класса говорит, что класс должен быть loosely coupled и highly cohesive, должны follow Single Responsibility Principle (SRP), здесь

Coupling -> Степень знания класс имеет о другой класс

Cohesion -> Степень, который говорит, насколько хорошо сосредоточены ваш класс

SRP -> Класс должен иметь только одну ответственность, должна быть только одна причина для изменения класса.

Так что в соответствии с принципом сплоченности и SRP принцип должен быть хорошо сфокусированным и иметь только одну ответственность.

Здесь в вашем случае у вас есть только 2 боба, но в будущем эти бобы могут увеличиться. Поэтому следует следовать вашему второму пункту и создать еще один класс для вашей декларации bean.

И в моем выборе должно быть даже создано больше классов конфигурации. Поэтому один класс конфигурации должен иметь аналогичный тип компонентов.

1

Да, в том числе ваши бобы внутри класса @Configuration обычно являются предпочтительным способом для Spring.

Это также один из способов Spring рекомендует инъекционные взаимозависимости между бобами показано в следующем примере, скопированного из справочного руководства весной в here:

Кроме того, область применения по умолчанию @Beans является SINGLETON, если вы укажите другую область, такую ​​как PROTOTYPE, вызов будет передан исходному методу. Посмотрите на этот раздел в разделе Spring Reference Guide

Смежные вопросы