Spring 给容器注册组件的几种方式
- 组件标注注解
- @Bean
- @Import
- FactoryBean()
组件标注注解
适用场景:自己写的类
@Controller、@Service、@Repository、@Component
@Bean
适用场景:导入第三方包里面的组件
@Bean("linus")
public Person person02() {
return new Person("linux", 48);
}
@Import
适用场景:快速给容器导入组件
三种@import方式
-
@Import 类名数组;容器中就会自动注册这几个组件,id 是全类名
@Import({Color.class, Red.class) public class Config { ... } -
ImportSelector(自定义逻辑需要导入的组件):返回需要导入组件的全类名数组
//自定义逻辑返回需要导入的组件 public class MyImportSelector implements ImportSelector{ //返回值,就是导入容器中的组件全类名 //AnnotationMetadata:当前标注@Import注解的类的所有注解信息 @Override public String[] selectImports(AnnotationMetadata importingClassMetadata) { //方法不要返回null return new String[] {"com.dwb.bean.Blue", "com.dwb.bean.Yellow"}; } }说明:实现方法不能返回null;否则容器运行会报错
@Import({Color.class, Red.class, MyImportSelector.class) public class Config { ... } -
ImportBeanDefinitionRegistrar:手动注册bean到容器中
public class MyImportBeanDefinitionRegistrar implements ImportBeanDefinitionRegistrar{ /** * AnnotationMetadata : 当前类的注解信息 * BeanDefinitionRegistry :BeanDefinition注册类; * 把所有需要添加到容器中的bean;调用 * BeanDefinitionRegistry.registerBeanDefinition 手动注册 */ @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { boolean definition = registry.containsBeanDefinition("com.dwb.bean.Red"); boolean definition2 = registry.containsBeanDefinition("com.dwb.bean.Blue"); if (definition && definition2) { //指定bean定义信息(Bean的类型,...) RootBeanDefinition beanDefinition = new RootBeanDefinition(RainBow.class); //注册一个bean,指定bean名 registry.registerBeanDefinition("rainBow", beanDefinition); } }@Import({Color.class, Red.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class) public class Config { ... }
使用Spring提供的FactoryBean()
-
默认获取到的是工厂bean调用getObject创建的对象
-
获取工厂bean本身,我们需要给id前面加一个&;如:&colorFactoryBean
//创建一个Spring定义的factoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一个color对象,这个对象会添加到容器中
@Override
public Color getObject() throws Exception {
// TODO Auto-generated method stub
System.out.println("创建color实例...");
return new Color();
}
@Override
public Class<?> getObjectType() {
// TODO Auto-generated method stub
return Color.class;
}
//控制是否是单例
//true :这个bean是单实例,在容器中只保存一份
//false:多实例,每次获取创建一个实例
@Override
public boolean isSingleton() {
// TODO Auto-generated method stub
return true;
}
}
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
//工程bean获取的是调用getObject创建的对象
Object bean2 = applicationContext.getBean("colorFactoryBean");
Object bean3 = applicationContext.getBean("colorFactoryBean");
System.out.println("bean的类型:" + bean2.getClass());
System.out.println(bean2 == bean3);
Object bean4 = applicationContext.getBean("&colorFactoryBean");
System.out.println("bean4的类型:" + bean4.getClass());
说明:默认获取到的是工厂是工厂类中调用getObject创建的对象; 若要获取工厂bean本身,我们需要给id前面加一个&;如:&colorFactoryBean
输出
bean的类型:class com.dwb.bean.Color
true
bean4的类型:class com.dwb.bean.ColorFactoryBean










网友评论