在实际开发中也可以使用Spring提供的工厂bean来注册组件
首先创建工厂bean的实现
/** * 泛型T即为通过工厂bean获得的bean对象 * */ public class ColorFactory implements FactoryBean<Color> { /** * 容器通过工厂bean的getObject方法获得要加载的bean */ public Color getObject() throws Exception { return new Color(); } /** * 返回要在ioc容器中的bean的类型 */ public Class<?> getObjectType() { // TODO Auto-generated method stub return Color.class; } /** * 设置bean对象在容器里面是否是单例 * 返回为true:单例的 * 返回为flase:多例的 */ public boolean isSingleton() { return false; } }
在主配置类中通过@Bean注解将ColorFactory注册到容器中
@Configuration public class MainConfig2 { //方法名为默认id @Bean public ColorFactory getColorFactory() { return new ColorFactory(); } }
在测试类中我们通过获取容器中组件id的方式获取容器中的bean对象
public class IOCTest { @Test public void test4() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class); Object colorFactory = applicationContext.getBean("getColorFactory") ; System.out.println(colorFactory); } }
运行结果:
com.wxj.bean.Color@57d5872c
我们发现容器中存在的并不是ColorFactory对像,而是Color对象.通过观察可知,容器通过工厂bean的getObject()方法返回的对象来进行创建并注册到容器中.
那么如果非要获取ColorFactory对象,应该怎么获取呢?需要在获取bean的id名称前添加一个"&"符即可.
public class IOCTest { @Test public void test4() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2.class); Object colorFactory = applicationContext.getBean("&getColorFactory") ;//"&"可获得工厂bean对象 System.out.println(colorFactory); } }
运行结果:
com.wxj.ColorFactory@57d5872c
扩展:
在使用单实例的时候,getObject方法只会被调用一次,而在多实例的情况下每次获取bean都会调用getObject()方法.