Spring注解--@Import使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fangxinde/article/details/82766605

@Import注解修饰配置类,作用是快速给容器中导入一个组件,容器中自动注册这个组件,id是默认全类名

1.@Import属性值为需注册到容器中的bean类

@Import({Color.class})修饰配置类,要导入容器是Color.java实例(组件)

 
@Configuration
@Import({Color.class})
public class MainConfig { 
}

 自定义一个java类(需要注册到容器中的类,也就是组件)

public class Color { 
	 
}

测试方法:

@Test
	public void testImport(){
		AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class);
		String[] names = applicationContext.getBeanDefinitionNames();
		for (String name : names) {
			System.out.println("====="+name);
		}
}

测试结果:

=====mainConfig2
=====com.atguigu.bean.Color

2.@Import(value={xxxx})注解的value值为自定义的选择器类,此选择器实现ImportSelector接口

选择器通过全类名选择需要实例化的组件。

1)@Import({MyImportSelector.class})修饰配置类:其value值为自定义的选择器类 MyImportSelector.class

 
@Configuration
@Import({MyImportSelector.class})
public class MainConfig { 
}

2)编制选择器类,通过方法selectImports,选择需要的bean类注册到容器

通过bean类的全类名进行选择,本例中选择两个例:com.rsd.bean.Blue    com.rsd.bean.Yellow    

return new String[]{"com.rsd.bean.Blue","com.rsd.bean.Yellow"};

public class MyImportSelector implements ImportSelector {
	 
	/**
	 * AnnotationMetadata:当前配置类的所有注解(指修饰类的注解)信息。
	 */
	@Override
	public String[] selectImports(AnnotationMetadata importingClassMetadata) {
		return new String[]{"com.rsd.bean.Blue","com.rsd.bean.Yellow"};
	}
}

 3)编制两个需要实例化的类:Blue.java   Yellow.java

package com.rsd.bean;

public class Blue {

}
package com.rsd.bean;

public class Yellow {

}

测试例与1相同:

运行结果:=====mainConfig2
=====com.rsd.bean.Blue
=====com.rsd.bean.Yellow

3.@Import(value={xxxx})注解的value值为自定义的注册类,此选择器实现ImportBeanDefinitionRegistrar接口,

 通过手动将bean类注册到容器中

1)@Import(value={MyImportBeanDefinitonRegistrar.class})注解的属性值为自定义的bean注册实现类

 
@Configuration
@Import(value={MyImportBeanDefinitonRegistrar.class})
public class MainConfig { 
}

2)注册类中通过registry对象将RainBow类手动注册至容器

public class MyImportBeanDefinitonRegistrar implements ImportBeanDefinitionRegistrar{
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata,BeanDefinitionRegistry registry) {
             RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class);
            registry.registerBeanDefinition("rainBow", beanDefinition);
    }
}

 3)需要注册到容器中bean类

package com.atguigu.bean;

public class RainBow {

}

测试案例与以上相同:

运行结果为

=====mainConfig2
=====rainBow

猜你喜欢

转载自blog.csdn.net/fangxinde/article/details/82766605