一、使用 FactoryBean 注册组件
使用Spring 提供的 FactoryBean(工厂Bean)注册组件。
Spring中提供了 FactoryBean 这个接口,用于定义工厂Bean。
自定义一个 Spring 的 FactoryBean:
//创建一个Spring定义的FactoryBean
public class ColorFactoryBean implements FactoryBean<Color> {
//返回一个 Color对象,这个对象会添加到容器中
@Override
public Color getObject() throws Exception {
return new Color();
}
@Override
public Class<?> getObjectType() {
return Color.class;
}
//控制是否为单例
//true 这个bean是单实例,在容器中保存一份
//false 这个bean是多实例,每次获取都创建一个新的
@Override
public boolean isSingleton() {
return true;
}
}
在配置类中注册工厂 Bean:
@Configuration
public class MainConfig5 {
@Bean
public ColorFactoryBean colorFactoryBean() {
return new ColorFactoryBean();
}
}
测试:
@Test
public void test05() {
ApplicationContext ioc = new AnnotationConfigApplicationContext(MainConfig5.class);
System.out.println("IOC容器创建完成");
//工厂Bean获取的是调用getObject() 方法创建的对象
//获取的是工厂中生产的 bean 对象
Object bean = ioc.getBean("colorFactoryBean");
Object bean2 = ioc.getBean("colorFactoryBean");
System.out.println(bean == bean2);
System.out.println("bean的类型是" + bean.getClass());
//在id前面加 & 前缀获取工厂
//获取的是 工厂 本身
Object bean3 = ioc.getBean("&colorFactoryBean");
System.out.println(bean3.getClass());
}
小结:FactoryBean中创建的是工厂中生产的 bean
(1)默认获取的是工厂 bean,调用 getObject() 创建的对象;
(2)如果要获取工厂bean本身,需要在 id 前面加上一个 & ,如:&colorFactoryBean
二、给容器中注册组件方式
1) 通过包扫描+组件标注注解(@Controller/@Service/@Repository/@Component)【适用于添加自己写的类】
2)@Bean 导入第三方包里面的组件
3)@Import:快速给容器中导入一个组件
【1】@Import(要导入到容器中组件),容器会自动注册这个组件,id 默认是全类名;
【2】ImportSelector:返回需要导入的 组件的全类名数组;
【3】ImportBeanDefinitionRegistrar:手动注册 bean 到容器中
4)使用Spring提供的FactoryBean(工厂Bean):创建的工厂中生产的bean
1)默认获取的是工厂bean调用getObject创建的对象
2)要获取工厂 bean 本身,需要给id前面加一个 &,如:&colorFactoryBean