>  기사  >  Java  >  SpringBoot는 Bean을 로드할 때 어떻게 나를 먼저 선택합니까?

SpringBoot는 Bean을 로드할 때 어떻게 나를 먼저 선택합니까?

王林
王林앞으로
2023-05-15 21:13:041219검색

    1. 적용 가능한 시나리오

    • 애플리케이션의 모든 계층에서 특정 Bean의 시작 순서를 관리해야 하는 경우. 예를 들어, 애플리케이션이 시작될 때 Bean을 초기화해야 합니다.

    • 공용 라이브러리의 Bean을 다른 개발자 서비스에서 사용하지만 일부 시나리오에서 Bean을 사용자 정의해야 하는 경우 이러한 사용자 정의 Bean보다 먼저 공용 라이브러리에 Bean을 로드해야 합니다.

    두 가지 구현 방법

    Spring Boot 애플리케이션에서는 다음 세 가지 방법을 채택하여 Bean의 우선 순위 로드를 구현할 수 있습니다.

    1. @Configuration 주석 + @DependsOn 주석

    @ Configuration 주석은 Spring Boot 애플리케이션에서 Bean을 선언하고 Bean의 우선순위를 지정할 수 있도록 합니다. 그런 다음 @DependsOn 주석을 사용하여 이러한 Bean을 로드해야 하는 애플리케이션 단계를 Spring 컨테이너에 명시적으로 알릴 수 있습니다.

    사용법은 다음과 같습니다.

    (1) @Configuration 주석을 선언하고 @DependsOn 주석을 사용하고 참조된 Bean이 이미 존재하는지 확인합니다(다른 Bean 또는 구성 클래스일 수 있음).

    @Configuration 
    @DependsOn("myOrderBean") 
    public class MyOrderedBeanConfig {
       // 配置类内普通Bean
       @Bean
       public MyBean myBean() {
          return new MyBean();
       }
    }

    (2) Spring Boot 애플리케이션에 @Configuration 주석을 도입하여 애플리케이션이 시작될 때 실행되도록 합니다.

    @SpringBootApplication
    @Import(MyOrderedBeanConfig.class)
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    2. @Component 주석 + @DependsOn 주석

    @Component 주석은 Bean을 선언하는 가장 빠른 방법 중 하나이며 Bean의 이름을 지정할 수 있습니다. 애플리케이션이 시작될 때 기존 Bean을 먼저 로드하려면 @DependsOn 주석을 사용하여 이를 달성할 수 있습니다. 여러 개의 Bean을 지정하는 경우 쉼표를 사용하여 구분할 수 있습니다.

    사용법은 다음과 같습니다.

    (1) @Component 어노테이션이 붙은 클래스에서는 @DependsOn 어노테이션을 사용하여 Bean의 로딩 순서를 명확하게 지정합니다.

    @Component("myBean") 
    @DependsOn({"bean1", "bean2"}) 
    public class MyBean {
       // ...
    }

    (2) Spring Boot 애플리케이션에 @Component 주석을 도입하여 애플리케이션이 시작될 때 실행되도록 합니다.

    @SpringBootApplication 
    @ComponentScan(basePackages = "com.example.demo") 
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    3. PriorityOrdered 인터페이스 구현

    PriorityOrdered 인터페이스를 구현하고 getOrder() 메소드를 구현하여 Bean의 로드 순서를 제어할 수 있습니다. 마지막으로 BeanPostProcessor 인터페이스를 사용하여 이러한 Bean이 처음 생성될 때 로드되도록 할 수 있습니다.

    사용법은 다음과 같습니다.

    (1) PriorityOrdered 인터페이스를 구현하고 getOrder() 메서드를 사용하여 양의 정수를 반환하여 Bean의 우선순위를 지정합니다. 값이 작을수록 우선순위가 높아집니다.

    public class MyBean implements InitializingBean, PriorityOrdered {
       public void afterPropertiesSet() {
           // ...
       }
       public int getOrder() {
          return 0; // 这个值将确保此 bean 被最先加载
       }
    }

    (2) BeanPostProcessor 인스턴스를 제공하고 @Order 주석으로 순서를 지정합니다. 이 인스턴스는 Spring 컨테이너의 라이프사이클에서 모든 일반 Bean보다 먼저 실행됩니다.

    @Component 
    @Order(value = 1) 
    public class MyBeanPostProcessor implements BeanPostProcessor {
       // ...
    }

    (3) @ComponentScan 주석을 Spring Boot 애플리케이션에 도입하여 애플리케이션이 시작될 때 실행되도록 합니다.

    @SpringBootApplication 
    @ComponentScan(basePackages = {"com.example.demo"}) 
    public class DemoApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoApplication.class, args);
       }
    }

    Notes

    • 애플리케이션에서 위 방법 중 하나를 사용하면 Bean의 우선순위를 관리하는 데 도움이 될 수 있지만 이것이 해당 우선순위가 다른 Bean에 의해 재정의되지 않는다는 의미는 아닙니다.

    • 이전에 선언한 Bean을 재정의하려는 경우 해당 기술 스택의 우선순위가 높은 Bean을 사용하여 이전에 선언한 Bean을 재정의할 수 있습니다.

    • 모든 빈에 @Order 주석을 사용하거나 Ordered 인터페이스를 구현하여 빈 정렬을 구현할 수 있습니다.

    • 여러 기술 스택을 사용하는 경우 이러한 기술 스택을 혼합하여 사용하여 목표를 달성할 수 있습니다.

    위 내용은 SpringBoot는 Bean을 로드할 때 어떻게 나를 먼저 선택합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    성명:
    이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제