Spring - FactoryBean

FactoryBean

通过FactoryBean接口也能实现往Spring的IOC容器中注册Bean,只需要实现FactoryBean接口,然后实现FactoryBean中的三个接口。其中方法getObject返回你要往Spring的IOC容器中注入的Bean即可,getObjectType返回你需要注入到Spring的IOC容器中的Bean的类型,方法isSingleton返回为true是,你的Bean就以单例的形式存在,为false时就是每次过去Bean实例的时候都会从新创建一个

/**
 * 自定义FactoryBean
 */
public class ColorFactoryBean implements FactoryBean<Color> {
    @Override
    public Color getObject() throws Exception {
        return new Color();
    }

    @Override
    public Class<?> getObjectType() {
        return Color.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}

通过配置文件将我们实现的ColorFactoryBean注册到Spring的IOC容器中

//告诉Spring这是一个配置文件
@Configuration
@Import({Rad.class, Blue.class, MyImportSelector.class, MyImportBeanDefinitionRegistrar.class})
//用Import向Spring的IOC容器中导入Rad类的实例和Blue类的实例,以及我们在ImportSelector中返回的类
public class SpringConfig7 {

    @Conditional({WindowsCondition.class})
    @Bean(name = "bill")//给容器中注册一个bean
    public Person getPerson01() {
        return new Person("bill", 62);
    }

    @Conditional({LinuxCondition.class})
    @Bean(name = "linus")//给容器中注册一个bean
    public Person getPerson02() {
        return new Person("linus", 89);
    }

    @Bean
    public ColorFactoryBean colorFactoryBean() {
        return new ColorFactoryBean();
    }
}

获取我们注册的ColorFactoryBean的实例

//获取Bean实例  
  @Test
    public void testAnnotation7() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig7.class);
        Object colorBean = context.getBean("colorFactoryBean");
        System.out.println(colorBean);
        //获取我们注册的ColorFactoryBean,需要在注册的名字前加一个&符号
        Object colorFactoryBean = context.getBean("&colorFactoryBean");
        System.out.println(colorFactoryBean);
    }


//打印信息
com.booyue.tlh.annotation.bean.Color@791f145a
com.booyue.tlh.annotation.bean.ColorFactoryBean@38cee291

 

总结一下我们往Spring的IOC容器中注册Bean的方法

  • @ComponentScan或者@ComponentScans包扫描+组件标注注解(@Service、@Repository、@Controller、@RestController、@Component)
  • @Bean
  • @Import
    • @Import时,需要填写对应类的class,注册到Spring的IOC容器中Bean实例的名称为全类名
    • ImprotSelector:需要返回Bean的全类名
    • ImportBeanDefinitionRegistrar:手动注册Bean到Spring的IOC容器中
  • 使用Spring提供的FactoryBean接口(SpringBoot中扩展有用到)

猜你喜欢

转载自blog.csdn.net/qq_27062249/article/details/118069575