版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nrsc272420199/article/details/88560271
源码:https://github.com/nieandsun/spring-study
1.简介
@Import注解是一个平常我们很少用,但很多框架源码里经常出现的注解,使用该注解也可以向spring容器中注册bean实例.
2.@Import注解的value类型
3. Demo
代码结构
3.1 普通类.class
- 配置类
@Configuration
/**将Dog和Cat类注入到Spring容器*/
@Import(value = {Dog.class, Cat.class})
public class ImportStudyConfig1 {
}
- 运行结果
3.2 继承了ImportBeanDefinitionRegistrar接口的类.class
- 继承了ImportSelector接口的类
package com.nrsc.springstudy.c2_import.config;
import org.springframework.context.annotation.ImportSelector;
import org.springframework.core.type.AnnotationMetadata;
public class NrscImportSelector implements ImportSelector {
/**
* 该类需要实现的方法就一个
* @param importingClassMetadata
* @return
*/
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
//返回要注入到spring容器的全类名
return new String[]{
"com.nrsc.springstudy.c2_import.bean.Duck",
"com.nrsc.springstudy.c2_import.bean.Elephant"};
}
}
- 配置类
@Configuration
@Import(value = {Dog.class, Cat.class,NrscImportSelector.class})
public class ImportStudyConfig2 {
}
- 运行结果
3.3 继承了ImportBeanDefinitionRegistrar接口的类.class
- 继承了ImportBeanDefinitionRegistrar接口的类
package com.nrsc.springstudy.c2_import.config;
import com.nrsc.springstudy.c2_import.bean.Pig;
import com.nrsc.springstudy.c2_import.bean.Sheep;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
public class NrscImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar {
/**
* 该类需要实现的方法就一个
* @param importingClassMetadata 当前类的注解信息
* @param registry 可以把要加入到Spring容器中的类加入进去
*/
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
//查看Elephant类是否被定义---也可以理解为查看Elephant是否注册到spring容器中
boolean bean1 = registry.containsBeanDefinition("com.nrsc.springstudy.c2_import.bean.Elephant");
boolean bean2 = registry.containsBeanDefinition("com.nrsc.springstudy.c2_import.bean.Rabbit");
//如果Elephant注册了,则注册Pig类到Sping容器------>pig应该可以被注册到spring容器
if(bean1){
RootBeanDefinition beanDefinition = new RootBeanDefinition(Pig.class);
//可以自己指定注入到Spring容器中的key值为pig
registry.registerBeanDefinition("pig", beanDefinition);
}
//如果Rabbit注册了,则注册Sheep类到Sping容器------>Sheep应该可以被注册到spring容器
if(bean2){
RootBeanDefinition beanDefinition = new RootBeanDefinition(Sheep.class);
registry.registerBeanDefinition("sheep", beanDefinition);
}
}
}
- 配置类
@Configuration
@Import(value = {Dog.class, Cat.class, NrscImportSelector.class, NrscImportBeanDefinitionRegistrar.class})
public class ImportStudyConfig3 {
}
- 运行结果