스프링 프레임 워크 구성 요소 등록 @Import

스프링 프레임 워크 구성 요소 등록 @Import

사설

스프링 어셈블리를 등록하면 스프링을 사용하는 나 자바빈에게 기능적인 전제 조건을 호출하는 것입니다. 우리는 이러한 이전 기사로 컨테이너, 봄에 일반 자바 빈즈 등록 할 수 있도록 그리고 봄도, 다양한 방법을 제공합니다 @Component 등록 스프링 프레임 워크의 구성 요소를 사용하여 작성된 @Component메모를 컨테이너에 일반 자바 빈즈 등록됩니다, 종이는 말한다 @Import노트는 프레임 워크는 컨테이너에 등록 된 일반 JavaBean의뿐만 아니라 말을 후속 기사 제공 할 것입니다 봄 @Configuration, FactoryBean및 기타 수단을.

@Import 일반 콩 등록

사용은 @Import단지 필요, 일반 콩을 등록 @Import빈을 지정 수업 시간에 언급을 등록 할

/**
 * 使用Import注解,注册一个普通的Bean
 */
@Data
public class TestImport {
    private String id = "@Import";
}

봄 부트 클래스에서 추가 @Import주석을

/**
 * spring 容器启动引导类
 */
@Import(TestImport.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
        System.out.println("Bean Name is : " + Arrays.toString(beanNames));
        TestImport bean = applicationContext.getBean(TestImport.class);
        System.out.println("TestImport bean : " + bean);
        applicationContext.close();
    }
}

스프링 컨테이너 시작, 콘솔 인쇄 결과 후 :

컨텍스트 ID : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
콩 이름은 [com.spring.study.ioc.register.TestImport]
TestImport 콩 : TestImport (ID = @ 오기)

간단하게 사용하여 @Import주석을, 당신은 스프링 컨테이너에 등록 된 일반 JavaBean의 수 있습니다. 그리고 우리가 그를 볼 수 있습니다 @ImportJavaBean의의 전체 클래스 이름을 등록 주석의 기본 구성 요소 이름

가져 오기 구성 클래스 @Import

사용 @Import주석 가져 오기 구성 클래스를 구성 봄 클래스 용기에 등록 된 모든 구성 요소를 될 것입니다. 봄 아닌 @Configuration클래스 그러나. 클래스 라벨 구성이다 @Configuration사출 스프링 때 표시 프록시 객체 클래스를 생성하고, 사용하지 않는 @Configuration주석이 매우 다르다 단일 후속 내용은 본 명세서에 설명 될 것이며, 여기에서 더 설명하지 않는다.

/**
 * spring组件配置类
 */
//@Configuration 使用@Import导入时,此注解可以不加
public class TestConfiguration {
    @Bean
    public TestImport testImport() {
        return new TestImport();
    }

    @Bean
    public TestImport testImport2() {
        return new TestImport();
    }
}

@Import주석 클래스 지정 구성을 소개합니다

/**
 * spring 容器启动引导类
 */
@Import(TestConfiguration.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanNamesForType(TestImport.class);
        System.out.println("Bean Name is : " + Arrays.toString(beanNames));
        TestImport bean = (TestImport) applicationContext.getBean("testImport");
        System.out.println("TestImport bean : " + bean);
        applicationContext.close();
    }
}

기동 스프링 용기 배치 후에 주석이 클래스는 또한 스프링 용기에 등록한다 :

컨텍스트 ID : org.springframework.context.annotation.AnnotationConfigApplicationContext@21b8d17c
콩 이름은 다음 [testImport, testImport2]
TestImport 콩 : TestImport (ID = @ 오기)

결과로부터 알 수있는 바와 같이, 그 때에 등록되어있는 구성 요소 이름 요소 이름 구성 클래스 정한다 구성 및 카테고리에 의해이 경우 복수의 성분으로 도입 될 수있다.

ImportSelector 등록 @Import

에서는 ImportSelector계면에만 인터페이스 정의 selectImports이 리턴 자바빈 어레이의 전체 클래스 이름을 통해 상기 사용 등록 인터페이스를 필요로 @Import수입, 인터페이스는 스프링 컨테이너에 등록 된 모든 클래스를 반환

/**
 * 通过 ImportSelector 接口注册组件
 */
@Data
public class TestSelector {
    private String id = "@Import:ImportSelector";
}

사용자 정의 구현 ImportSelector인터페이스

/**
 * 自定义组件选择器,通过返回需要注册的bean的全类名,进行快速的在IOC容器中注册组件
 */
public class CustomImportSelector implements ImportSelector {

    /**
     * @param importingClassMetadata 标注了@Import配置类上面所有的注解信息
     */
    public String[] selectImports(AnnotationMetadata importingClassMetadata) {
        return new String[]{TestSelector.class.getName()};
    }
}

@ImportImportSelector 구현 클래스에 지정된 노트

/**
 * spring 容器启动引导类
 */
@Import(CustomImportSelector.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        TestSelector bean = applicationContext.getBean(TestSelector.class);
        System.out.println("TestSelector bean : " + bean);
        String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

스프링 컨테이너 시작, 콘솔 인쇄 결과 후 :

컨텍스트 ID : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81
TestSelector 콩 : TestSelector (ID = @ 오기 : ImportSelector)
빈 이름 : com.spring.study.ioc.register.TestSelector]

결과로부터 알 수있는 바와 같이, TestSelector이것은 스프링 컨테이너에 등록된다. 이전에 직접 등록을 비교하고, 보지 못했다 ImportSelector인터페이스의 두드러진 특징. 이 문서는 간단한 설명이다 ImportSelector인터페이스가 어떻게 수행 시작시 스프링 컨테이너 컴포넌트를 등록하는 기능을 갖고 BeanDefinitionRegistryPostProcessor호출 selectImports을 사용하는 방법, 방법을 ImportSelector후속 기사 인터페이스 더 복잡한 등록 기능에 대한 충분한 지식.

ImportBeanDefinitionRegistrar 등록 @Import

에서는 ImportBeanDefinitionRegistrar인터페이스 만 정의 registerBeanDefinitions방법,이 방법으로 얻을 수있는 BeanDefinitionRegistry오브젝트가 오브젝트 스프링 컨테이너 조립체는 수동으로이를 필요로 등록 할 수있다. 사용 BeanDefinitionRegistry목적, 당신은 봄에 등록 된 구성 요소 빈 컨테이너의 이름을 지정할 수 있습니다.

/**
 * 通过 ImportBeanDefinitionRegistrar 接口手动注册组件
 */
@Data
public class TestRegistrar {
    private String id = "@Import:TestRegistrar";
}

사용자 정의 구현 ImportBeanDefinitionRegistrar인터페이스

/**
 * 手动注册组件到IOC容器中
 */
public class CustomImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
    /**
     * @param importingClassMetadata 标注了@Import配置类上面所有的注解信息
     * @param registry               BeanDefinition注册器,可以通过此registry手动的向容器中注册指定的组件
     */
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        if (!registry.containsBeanDefinition("testRegistrar")) {
            BeanDefinition definition = new RootBeanDefinition(TestRegistrar.class);
            registry.registerBeanDefinition("testRegistrar", definition);
        }
    }
}

@Import ImportBeanDefinitionRegistrar 구현 클래스에 지정된 노트

/**
 * spring 容器启动引导类
 */
@Import(CustomImportBeanDefinitionRegistrar.class)
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        TestRegistrar bean = applicationContext.getBean(TestRegistrar.class);
        System.out.println("TestRegistrar bean : " + bean);
        String[] beanNames = applicationContext.getBeanNamesForType(TestSelector.class);
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

스프링 컨테이너 시작, 콘솔 인쇄 결과 후 :

컨텍스트 ID : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81
TestRegistrar 콩 : TestRegistrar (ID = @ 오기 : TestRegistrar)
빈 이름 : testRegistrar]

또한, 알 수있는 TestRegistrar것이 스프링 컨테이너에 등록된다. 그리고 ImportSelector인터페이스 컨테이너함으로써 시작 스프링 BeanDefinitionRegistryPostProcessor인터페이스 방법을 수행하는 단계를 포함한다.

다중 인터페이스 등록을 지정 @Import

상기 예는 각각의 사용을 예시 @Import직접 빈 클래스 구성 클래스 도입하여, ImportSelector인터페이스, ImportBeanDefinitionRegistrar스프링 컨테이너 조립체 인터페이스 레지스터. 물론, 사용 @Import주석의, 당신은 동시에 등록 할 수 위의 여러 가지 방법 중 하나를 지정할 수 있습니다

/**
 * spring 容器启动引导类
 *
 * @author TangFD
 * @since 2019/6/25.
 */
@Import({
        TestComponent.class,
        TestConfiguration.class,
        CustomImportSelector.class,
        CustomImportBeanDefinitionRegistrar.class
})
public class TestImportBootstrap {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext applicationContext =
                new AnnotationConfigApplicationContext(TestImportBootstrap.class);
        System.out.println("context id : " + applicationContext.getId());
        String[] beanNames = applicationContext.getBeanDefinitionNames();
        System.out.println("bean names:" + Arrays.asList(beanNames));
        applicationContext.close();
    }
}

스프링 컨테이너 시작, 콘솔 인쇄 결과 후 :

컨텍스트 ID : org.springframework.context.annotation.AnnotationConfigApplicationContext@238e0d81의
빈 이름 : [org.springframework.context.annotation.internalConfigurationAnnotationProcessor, org.springframework.context.annotation.internalAutowiredAnnotationProcessor, org.springframework.context.annotation.internalCommonAnnotationProcessor, 조직. springframework.context.event.internalEventListenerProcessor, org.springframework.context.event.internalEventListenerFactory, testImportBootstrap, com.spring.study.ioc.register.TestComponent, com.spring.study.ioc.register.TestConfiguration, testImport, testImport2, COM. spring.study.ioc.register.TestSelector, testRegistrar]

개요

등록 된 컨테이너 구성 요소를 봄하는 방법에는 여러 가지가 있습니다, 본 논문에서는 사용하는 방법을 설명 @Import컨테이너 등록 구성 요소를 봄에 주석을. 그리고 지식 포인트의 유산에 대한 심층적 인 이해가 필요합니다 : 봄이 방법의 구현을 통해, 선박을 시작할 때 BeanDefinitionRegistryPostProcessor수행하는 ImportSelectorImportBeanDefinitionRegistrar인터페이스 구성 요소 등록 방법. 후속 스프링 스타트 업에서 용기의 내용물 여기서, 분석 BeanFactoryPostProcessor보충의 실행 인터페이스.

학습 간단한 문제가 결코 혼란이있을 수있다, 게으른 될 수 있지만, 진행 속도가 중단되지 않습니다.

짧은 단계, 천 마일, jianghai에없는 작은 스트림;

추천

출처blog.51cto.com/8950379/2416136