zoukankan      html  css  js  c++  java
  • spring:Beanfactory和ApplicationContext、BeanFactory 和 FactoryBean

    1、Beanfactory和ApplicationContext有什么区别

    ApplicationContext

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

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

    (2)继承BeanFactory接口

    (3)总结

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

     

    Beanfactory

    (1)最底层的一个接口

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

     getBean的时候创建了对象:

    (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创建了");
        }
    }

    创建一个类实现FactoryBean 接口:

    //该类返回的不是本类的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之前加上&。
    源码:
    FactoryBean有三个方法:
    • getObject返回需要注册到Spring容器中去的bean实体,
    • getObjectType返回你注册的这个Object的具体类型
    • isSingleton方法返回这个bean是不是单例的,如果是,那么Spring容器全局将只保持一个该实例对象,否则每次getBean都将获取到一个新的该实例对象。



    总结:

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

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

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

     

    每个人都会有一段异常艰难的时光 。 生活的压力 , 工作的失意 , 学业的压力。 爱的惶惶不可终日。 挺过来的 ,人生就会豁然开朗。 挺不过来的 ,时间也会教你 ,怎么与它们握手言和 ,所以不必害怕的。 ——杨绛
  • 相关阅读:
    ES6 generator生成器
    ES6 Class类(简单理解封装和继承)
    谷歌(chrome)浏览器下载文件另存为其它地址
    ES6 中的解构数组和对象
    获取数组中某一个元素的下标
    删除数组对象中某一个指定的对象
    jquery复选框全选功能
    正则获取字符串中的数字
    js刷新当前页面,刷新父页面
    找出最长序列的长度
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13533080.html
Copyright © 2011-2022 走看看