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中扩展有用到)