美文网首页
Spring 注册组件的几种方式

Spring 注册组件的几种方式

作者: 蜗牛写java | 来源:发表于2019-03-19 23:00 被阅读0次

Spring 给容器注册组件的几种方式

  1. 组件标注注解
  2. @Bean
  3. @Import
  4. FactoryBean()

组件标注注解

适用场景:自己写的类

@Controller、@Service、@Repository、@Component

@Bean

适用场景:导入第三方包里面的组件

@Bean("linus")
public Person person02() {
    return new Person("linux", 48);
}

@Import

适用场景:快速给容器导入组件

三种@import方式

  1. @Import 类名数组;容器中就会自动注册这几个组件,id 是全类名

    @Import({Color.class, Red.class)
    public class Config {
     ...        
    }
    
  2. 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 {
     ...        
    }
    
  3. 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

相关文章

网友评论

      本文标题:Spring 注册组件的几种方式

      本文链接:https://www.haomeiwen.com/subject/npgomqtx.html