BeanFactory(Bean工厂),创建Bean和管理Bean(如何完成创建Bean的过程):
Spring通过扫描注解(component)或者<bean/>来生成BeanDefinition对象,此时就会把BeanDefinition放入到BeanFactory中(这一步还没有完成Bean对象的创建,只是生成了BeanDefinition对象),我们还可以再通过BeanFactoryPostProcessor(Bean工厂的后置处理器),来对Bean的生成进行干预(修改BeanDefiniton对象的属性)----->接下来就是进行创建Bean对象(实例化、推断构造方法、依赖注入、aop等操作)------>放入单例池中(如果是单例的bean才有这步操作,singletonBeanMap是beanFactory中一个成员变量)(原型模式的话没有这步操作);
BeanFactory是一个接口,给具体的ioc容器的实现类提供规范;
ApplicationContext、XMLBeanFactory、DefaultListableBeanFactory是BeanFactory的子接口;
AnnotationConfigApplicationContext、ClassPathXmlApplicationContext、FileSystemXmlApplicationContext
这三个BeanFactory的实现类(在代码中使用这三个对象拿到Bean对象)
ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
applicationContext.getBean("user");
#applicationContext和BeanFactory的区别
applicationContext是BeanFactory的子接口,拥有BeanFactory没有的功能;
BeanFactory采用的是延迟加载,就是当你需要使用到某个bean的时候才会去加载,在启动的时候不会发现发现类加载的错误。
优点:启动快,占用内存少
缺点:启动时无法发现bean的装配错误
applicationContext在spring容器启动时完成时也完成了Bean的装配,可以发现Bean的装配问题
优点:运行时速度快,可以提早发现Bean的装配问题
缺点:启动速度慢,占用内存多
例如:1.可以获取系统的环境变量
applicationContext.getEnvironment.getSystemEnvironment();
//可以获取到例如用户名、处理器、JVM的信息、jdk的信息
2.可以获取资源信息,读取文件等资源;
3.国际化
4.发布事件