1、创建一个Color类
2、再创建自定义工厂类(实现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; //返回对象的类型 } //设置这个返回的bean是单例还是多例,true:单例;false:多例 @Override public boolean isSingleton() { return true; } }
3、在spring配置类中注入自定义的工厂类
@Configuration //告诉Spring这是配置类 public class MainConfig { /* * 这里注入的是colorFactoryBean * 在容器中通过id为colorFactoryBean获得bean时为该工厂的getObject返回的对象 * 如果想获得这个工厂bean,则需要在查询时的id前面加一个&,即&colorFactoryBean */ @Bean("colorFactoryBean") public ColorFactoryBean colorFactoryBean() { return new ColorFactoryBean(); } }
4、进行测试
/** * 测试通过FactoryBean方式注入组件 */ @Test public void test03() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Object bean = applicationContext.getBean("colorFactoryBean"); System.out.println("bean的类型:"+bean.getClass()); }
输出结果:
因为查询id为 colorFactoryBean所以默认是获取colorFactoryBean的getObject返回的对象,所以返回对象类型是com.atguigu.bean.Color
若就是想获得这个colorFactoryBean工厂bean,则在查询id前加一个&
即测试方法改为:
/** * 测试通过FactoryBean方式注入组件 */ @Test public void test03() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Object bean = applicationContext.getBean("&colorFactoryBean"); System.out.println("bean的类型:"+bean.getClass()); }
输出结果为:
加&后获得的是com.atguigu.bean.ColorFactoryBean
再修改测试方法
/** * 测试通过FactoryBean方式注入组件 */ @Test public void test03() { AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig.class); Object bean1 = applicationContext.getBean("colorFactoryBean"); Object bean2 = applicationContext.getBean("colorFactoryBean"); System.out.println(bean1 == bean2); }
输出
因为在colorFactoryBean里面的isSingleton方法返回的是true,所以获得的对象是单例的
6、spring注解学习——使用spring提供的FactoryBean(工厂bean)注入组件
原文:https://www.cnblogs.com/lyh233/p/12439135.html