Spring注解驱动第七讲--使用FactoryBean注册组件

在实际开发中也可以使用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()方法.

猜你喜欢

转载自www.cnblogs.com/xingjia/p/11210826.html