spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean

1、Beanfactory和ApplicationContext有什么区别

ApplicationContext

(1)在配置文件加载后创建bean

利用debug方式,在Student类的无参构造方法中书写输出语句,可以看看到在配置文件加载后即完成了bean的创建

spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第1张图片

(2)继承BeanFactory接口

spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第2张图片

(3)总结

  ApplicationContext: 应用上下文,继承BeanFactory接口,它是更高级的容器,它在启动的时候就把所有的Bean全部实例化了,可以及时检查依赖是否完全注入。并且在BeanFactory 基础上还提供了其他的功能,如国际化、统一资源文件读取等。

 

Beanfactory

(1)最底层的一个接口

spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第3张图片

(2)懒加载模式,只有在getBean的时候才会创建对象

spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第4张图片

 getBean的时候创建了对象:

spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第5张图片

(3)总结

  BeanFactory: 可以理解为含有 bean 集合的工厂类。是Spring里面最底层的接口,包含了各种bean的定义,读取bean配置文档,管理bean的加载、实例化,控制bean的生命周期,维护bean之间的依赖关系。它提供了实例化对象和拿对象的功能。 但它是延迟加载,如果bean没有完全注入,BeanFactory会在你第一次调用GetBean方法才会抛出异常。

 

2、BeanFactory 和 FactoryBean 有什么区别

  BeanFactory是个Factory,也就是IOC容器或对象工厂

  FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似。它是一种可以定制实例化Bean的方式,通过实现FactoryBean,完成自定义的Bean实例化细节。例如可以通过FactoryBean代理对象,对其所有方法进行拦截,形成AOP类似功能。

 创建Student类:

public class Student  {
    private String sname;
    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }
    public Student() {
        System.out.println("bean创建了");
    }
}

创建一个类实现BeanFactory接口:

//该类返回的不是本类的bean对象,而是返回getObject方法的返回值
public class MyFactoryBean implements FactoryBean {
    @Override
    public Object getObject() throws Exception {
        System.out.println("FactoryBean的"+"getObject");
        return new Student();
    }

    @Override
    public Class getObjectType() {
        return Student.class;
    }
}

测试方法:

    public void test1(){
            ApplicationContext applicationContext=new
                    ClassPathXmlApplicationContext("applicationContext.xml");//创建容器对象
            Student student= (Student) applicationContext.getBean("myfactorybean");
            System.out.println(student);
            MyFactoryBean myFactoryBean= (MyFactoryBean) applicationContext.getBean("&myfactorybean");
            System.out.println(myFactoryBean);
        }

测试结果:

   FactoryBean是一个接口,当在IOC容器中的Bean实现了FactoryBean后,通过getBean(String BeanName)获取到的Bean对象并不是FactoryBean的实现类对象,而是这个实现类中的getObject()方法返回的对象。要想获取FactoryBean的实现类,就要getBean(&BeanName),在BeanName之前加上&。

源码:
spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean_第6张图片
FactoryBean有三个方法:
getObject返回需要注册到Spring容器中去的bean实体,
getObjectType返回你注册的这个Object的具体类型
isSingleton方法返回这个bean是不是单例的,如果是,那么Spring容器全局将只保持一个该实例对象,否则每次getBean都将获取到一个新的该实例对象。



总结:

1、spring中的bean与对象的区别

bean:经过了完整的生命周期,存在于spring的容器中

java对象:再类中进行实例化

 

 

 

 

 

你可能感兴趣的:(spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean)