programing

Spring Boot의 @Bean 위치

mbctv 2023. 3. 22. 22:01
반응형

Spring Boot의 @Bean 위치

Spring Boot 앱에서 추가 콩을 등록할 수 있는 최적의 장소는 어디입니까?주석이 달린 메인 클래스가 있습니다.@SpringBootApplication그 클래스에 정의되어 있는 콩을 픽업합니다.그런데 그 원두를 다른 클래스에 넣어 보니 등록이 안 된 것 같습니다.

문서를 읽었을 때, 나는 그 생각이 떠올랐다.@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();
        }
    }
    

더 좋은 방법이 있을까요?

이는 거의 선호도의 문제이지만 일반적으로 노출된 콩을 논리적으로 그룹화된 구성 클래스에 넣는 것이 베스트 프랙티스로 간주됩니다.

예를 들어 AuthenticationProvider 또는 UserDetailsService에 대해 bean을 사용하는 인증 컨피규레이션클래스, 다양한 Tymeleaf 방언에 대해 bean을 포함하는 Tymeleaf 컨피규레이션클래스 등 여러 개의 Configuration클래스가 있을 수 있습니다.

사실, 당신의 선택은 어떤 것이 가장 좋은지를 결정하는 봄 표준이 존재하지 않지만 클래스 OOP 설계 원칙을 정의하면서 A 클래스는 다음과 같아야 합니다.loosely coupled그리고.highly cohesive,할까follow Single Responsibility Principle (SRP),여기서

Coupling--> 한 클래스가 다른 클래스에 대해

Cohesion--> 수업의 집중도를 나타내는 정도

SRP--> 클래스에는 1개의 책임밖에 없습니다.클래스를 변경하는 이유는 1개뿐입니다.

그래서 결속력과 SRP 원칙 수업은 잘 집중되어야 하며 오직 하나의 책임만 지어야 한다.

당신의 경우는 콩이 2개밖에 없지만, 앞으로는 이 콩이 늘어날지도 모릅니다.따라서 두 번째 포인트를 따라 빈 선언을 위한 다른 클래스를 만들어야 합니다.

또한 더 많은 구성 클래스를 만들어야 하므로 하나의 구성 클래스에는 비슷한 유형의 콩이 있어야 합니다.

네, 보통 봄에는 @Configuration 클래스에 콩을 포함시키는 것이 좋습니다.

이것은 또한 스프링이 콩 사이에 상호의존성을 주입하는 것을 권장하는 방법 중 하나이며, 스프링의 참조 가이드에서 복사한 다음 샘플에 나와 있습니다.

또한 기본 범위인 @Beans는 SINGLETON입니다.PROTEM 등의 다른 범위를 지정하면 콜은 원래 메서드로 전달됩니다.스프링 레퍼런스 가이드의 이 섹션을 참조하십시오.

은 일반적으로 주 .@SpringBootApplication 주석 수 있습니다.@ComponentScan(basePackageClasses = HelloWorld.class) 있습니다HelloWorld에는 '콩의 정의에 '콩'이라는 이 붙어 .@Beans 이 에는 '주석'이.@Configurations.

는 에 .@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는 에 지정된 @ComponentScan논쟁들.와일드카드 엔트리를 지정할 수도 있습니다.basePackageClasses들어 예를 들면,

@SpringBootApplication
@ComponentScan(basePackageClasses = HelloWorld.class)
public class DemoApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class);
    }

}

빈 클래스:

@Configuration
public class HelloWorld {

    @Bean
    public TweetUserSevice tweetUserSevice() {
        return new TweetUserSeviceImpl();
    }      
}

또 다른 접근법:

일반적으로 대형 프로젝트에서는 bean 정의를 포함하는 여러 spring 구성 클래스를 개최합니다.모든 콩 클래스가 메인 클래스의 서브 패키지에 들어가는 것에 대한 걱정을 피할 수 있습니다.할 수 수 단, 이 의 서브패키지 아래에 합니다).@SpringBootApplication주석은 마스터 구성을 자동으로 감지하고 다른 모든 빈 클래스를 가져옵니다.

는 콩클래스가 .TweetBeansConfig,TweetSystemHealthBeansConfigcom.ronak.tweet(이 패키지는 메인클래스가 존재하는 서브패키지가 아닙니다. 클래스1')가 .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);
      }

}

그것은 개인의 선택에 달려있고 그것을 하는 좋은 방법도 나쁜 방법도 없다.Spring Boot 관련 자료에서 권장 또는 제시되는 대로.

로서 ''을 사용하여 을 붙이기@SpringBootApplication부트스트랩스프링입니다, 내의 네스트 은 「」, 「」, 「」, 「」를 검출하지 .@Bean자동적으로 기억해야 할 것은 개인의 취향에 관한 것 이외에는요.

언급URL : https://stackoverflow.com/questions/29146019/where-to-put-bean-in-spring-boot

반응형