BeanFactory和FactoryBean的相关概念

1.BeanFactory

BeanFactory是一个Factory,负责生产和管理一个bean的工厂(spring中的IOC容器的核心接口),它有很多实现,如XmlBeanFactory、ApplicationContext都是常用的实现。

(1).XmlBeanFactory

可以通过实现类XmlBeanFactory的getBean方法获取spring容器中注册或者配置的Bean对象。

@Test
	public void test() {
     
		 //读取核心的配置文件;配置文件放在resources资源文件下
		 ClassPathResource resource = new ClassPathResource("ApplicationContext.xml");
		 //拿到核心对象
		 BeanFactory BeanFactory = new XmlBeanFactory(resource);
		 //根据xml配置的id获得bean对象
		//根据配置文件的id获取对象,spring不知道类型,需要强转
		 SpringHello bean = (SpringHello) BeanFactory.getBean("hello");
		 System.out.println(bean);
		//根据配置文件的类型获取对象
		 SpringHello bean2 = BeanFactory.getBean(SpringHello.class);
		 System.out.println(bean2);
		//根据配置文件的id,和类型获取对象
		 SpringHello bean3 = BeanFactory.getBean("hello",SpringHello.class);
		 System.out.println(bean3);
	}

(2)ApplicationContext

我们使用更多的是ApplicationContext接口,ApplicationContext的中文意思是"应用程序上下文",它继承自BeanFactory接口,除了包含BeanFactory的所有功能之外,在国际化支持、资源访问(如URL和文件)、事件传播等方面进行了良好的支持,被推荐为JavaEE应用之首选,可应用在Java APP与Java Web中。

@Test
	public void tesAt2() {
     
		//1.获到核心配置文件  applicationContext.xml
		//2.拿到核心对象(相当于启动了框架)
		//ClassPathXmlApplicationContext
		// 注意:ApplicationContext就是一个Bean工厂,且功能强大得多
		ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");
		//根据配置文件的id获取对象,spring不知道类型,需要强转
		SpringHello bean = (SpringHello) context.getBean("hello");
		System.out.println(bean);
		
		SpringHello bean2 = context.getBean("hello",SpringHello.class);
		System.out.println(bean2);
		//根据配置文件的类型获取对象
		SpringHello bean3 = context.getBean(SpringHello.class);
		System.out.println(bean3);
	}

当然上面两种获取Bean对象的方式都需要配置ApplicationContext.xml文件

 <!-- 
 	Spring要帮我们创建对象,我们把创建的对象都叫做bean
 	咱们得写配置告诉Spring,去帮咱们创建哪一个对象
 	bean:配置一个bean对象
 	id:这个bean的唯一名称
 	class:要配置的对象的类型(必需是全限定名)
 	Spring是通过反射去创建这个对象的
  -->
	<bean id = "hello" class= "cn.itsource._01hello.SpringHello"/>

2.FactoryBean

FactoryBean是一个Bean,这个Bean不是简单的Bean,而是一个能产生或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。
一般情况下,Spring通过反射机制利用的class属性指定实现类实例化Bean,在某些情况下,实例化Bean过程比较复杂,FactoryBean隐藏了实例化一些复杂Bean的细节,给上层应用带来了便利。

注意:通过getBean方法来FactoryBean创建的实例时实际获取的不是FactoryBean 本身而是具体创建的T泛型实例。

    //如果要使用FactoryBean的功能,那么要实现FactoryBean接口
    //MyBean的用处是生产其他的Bean
    //spring在加载Mybean的时候,发现它是一个FactoryBean,那么会自动调用getObject()来生成真正的bean
    public class MyBean implements FactoryBean<Car> {
     

        public Car getObject() throws Exception {
     
            return new Car();
        }

        public Class<?> getObjectType() {
     
            return Car.class;
        }

        public boolean isSingleton() {
     
            return false;
        }
    }

//将Mybean
 <bean id="car" class="cn.itsource._05_createbean._04_.MyBean"/>

这是测试代码

public class CarFactoryTest {
     
    @Test
    public void test(){
     
        ClassPathResource resource = new ClassPathResource("CarFactoryTest-Context.xml");
        //拿到核心对象
        BeanFactory BeanFactory = new XmlBeanFactory(resource);
        //根据xml配置的id获得bean对象
        Object bean1 = BeanFactory.getBean("car");
        System.out.println("bean1==="+bean1);
        //根据xml配置的id获得bean对象
        Object bean2 = BeanFactory.getBean("&car");
        System.out.println("bean2==="+bean2);
    }
}

运行打印可以得到:

根据配置文件获得的Bean对象不是FactoryBean本身,而是Car类的Bean;如果需要获得FactoryBean,根据xml配置的id获得bean对象的时候,加上“&”。


总结:
BeanFactory和FactoryBean没有任何联系,BeanFactory是Bean工厂,生产和管理Bean;
而FactoryBean是一个Bean,他的实现类中的getObject()方法返回的对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。它最大的一个作用是:可以让我们自定义Bean的创建过程。

你可能感兴趣的:(spring总结,spring,bean)