>Java >java지도 시간 >Springboot 자동 구성 및 @Configuration 구성 클래스 인스턴스 분석

Springboot 자동 구성 및 @Configuration 구성 클래스 인스턴스 분석

WBOY
WBOY앞으로
2023-05-14 18:25:14847검색

    @Configuration

    참고 1

    구성 클래스(@Configuration 아래의 이 클래스)는 실제로 팩토리와 동일합니다. @Bean 주석으로 표시된 메서드는 팩토리 메서드

    다음 예를 고려하세요.

        @Configuration
        // 注意点1: 配置类其实相当于一个工厂, 标注 @Bean 注解的方法相当于工厂方法
        static class MyConfig {
            @Bean
            public Bean1 bean1() {
                System.out.println("bean1()");
                return new Bean1();
            }

    Springboot 자동 구성 및 @Configuration 구성 클래스 인스턴스 분석

    향후에 bean1의 인스턴스를 생성하려면 먼저 myConfig(팩토리)라는 Bean을 찾은 다음 이 팩토리에서 "bean1"이라는 메소드를 호출하여 bean1을 생성해야 합니다. 물체.

    인스턴스 팩토리라고 하는 정적 수정이 없는 @Bean 팩토리 메소드의 경우 먼저 구성 클래스 myConfig의 인스턴스를 생성해야 합니다. 정적 수정이 있는 메소드는 정적 메소드이므로 myConfig의 클래스 객체만 가져온 다음 직접 가져오면 됩니다. 방법을 사용하십시오.

    참고 2

    @Bean은 메소드 오버로드를 지원하지 않습니다. 오버로드된 메소드가 여러 개인 경우 하나만 팩토리 메소드로 선택할 수 있습니다.

        @Configuration
        @MapperScan("aaa")
        // 注意点1: 配置类其实相当于一个工厂, 标注 @Bean 注解的方法相当于工厂方法
        static class MyConfig {
            // 注意点2: @Bean 不支持方法重载, 如果有多个重载方法, 仅有一个能入选为工厂方法
            @Bean
            public Bean1 bean1() {
                System.out.println("bean1()");
                return new Bean1();
            }
            @Bean
            public Bean1 bean1(@Value("${java.class.version}") String a) {
                System.out.println("bean1(" + a + ")");
                return new Bean1();
            }
            @Bean
            public Bean1 bean1(@Value("${java.class.version}") String a, @Value("${JAVA_HOME}") String b) {
                System.out.println("bean1(" + a + ", " + b + ")");
                return new Bean1();
            }

    오버로드된 메소드가 있는 경우 주입해야 할 값이 더 많아집니다. 매개변수는 레벨이 높을수록 우선순위가 부여됩니다.

    참고 3

    @Configuration은 기본적으로 주석이 달린 클래스에 대해 프록시가 생성되므로 임의로 삭제할 수 없습니다. 목적은 @Bean 메서드가 서로 호출할 때 해당 싱글톤 특성이 여전히 보장될 수 있도록 하는 것입니다.

    참고 4

    @Configuration BeanFactory 사후 프로세서가 포함된 경우 인스턴스 팩토리 메서드로 인해 MyConfig가 미리 생성되어 종속성 주입이 실패하게 됩니다. 해결 방법은 @Bean에 대해 정적 팩토리 메서드를 사용하거나 직접 종속성 주입을 사용하는 것입니다. MapperScanner의 경우 주석을 대신 사용할 수 있습니다.

    @SpringBootApplication은 @ComponentScan, @EnableAutoConfiguration 및 @SpringBootConfiguration으로 구성된 결합된 주석입니다.

    @SpringBootConfiguration 일반 @Configuration과 비교할 때 유일한 차이점은 다음과 같습니다. 전자는 전체 앱에서 한 번만 나타나도록 요구한다는 점입니다. 이를 기반으로 주요 구성 클래스가 결정되고, 주요 구성 클래스를 기준으로 전체 프로그램의 입구를 찾을 수 있기 때문입니다

    @ComponentScan: Component Scan

    excludeFilters - 구성요소 스캔 중에 제외하는 데 사용되며 자동 구성 클래스도 제외됩니다.

    @EnableAutoConfiguration은 또한 다음 주석으로 구성된 조합 주석입니다.

    @AutoConfigurationPackage – , 표시된 클래스가 기록된 패키지

    @Import(AutoConfigurationImportSelector.class) META-INF/spring을 로드하는 데 사용됨 .factories의 자동 구성 클래스(자동 구성 클래스는 기본 구성 클래스가 구성되지 않은 경우를 의미함) , 자동 구성 클래스가 사용됩니다)

    자동 구성 클래스를 직접 도입하기 위해 @Import를 사용하지 않는 이유

    두 가지 이유가 있습니다.

      기본 구성 클래스와 자동 구성 클래스를 강력하게 결합하도록 합니다. 구성 클래스는 어떤 하위 구성이 @Import(자동 구성 class.class)를 직접 사용하는지 알 수 없습니다. 도입된 구성 구문 분석 우선순위는 자동으로 기본 구성 시 구성 클래스의 구문 분석을 기본 구성으로 사용해야 합니다. 제공되지 않습니다. 따라서 @Import(AutoConfigurationImportSelector.class)가 사용됩니다. > 약한 결합을 달성하려면 META-INF/spring.factories에서 자동 구성 클래스를 읽으십시오.
    • 또한 AutoConfigurationImportSelector.class는 DeferredImportSelector 인터페이스를 구현하여 기본 구성보다 나중에 자동 구성을 구문 분석할 수 있도록 합니다.

    위 내용은 Springboot 자동 구성 및 @Configuration 구성 클래스 인스턴스 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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