스프링 프레임 워크 구성 요소 등록 @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의 수 있습니다. 그리고 우리가 그를 볼 수 있습니다 @Import
JavaBean의의 전체 클래스 이름을 등록 주석의 기본 구성 요소 이름
가져 오기 구성 클래스 @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()};
}
}
@Import
ImportSelector 구현 클래스에 지정된 노트
/**
* 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
수행하는 ImportSelector
및 ImportBeanDefinitionRegistrar
인터페이스 구성 요소 등록 방법. 후속 스프링 스타트 업에서 용기의 내용물 여기서, 분석 BeanFactoryPostProcessor
보충의 실행 인터페이스.
학습 간단한 문제가 결코 혼란이있을 수있다, 게으른 될 수 있지만, 진행 속도가 중단되지 않습니다.
짧은 단계, 천 마일, jianghai에없는 작은 스트림;