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创建了"); } }
创建一个类实现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); }
测试结果:
源码:
isSingleton方法返回这个bean是不是单例的,如果是,那么Spring容器全局将只保持一个该实例对象,否则每次getBean都将获取到一个新的该实例对象。
总结:
1、spring中的bean与对象的区别
bean:经过了完整的生命周期,存在于spring的容器中
java对象:再类中进行实例化