清凤

导航

 

转自:https://blog.csdn.net/pseudonym_/article/details/72826059

1. 两者的大概背景

BeanFactory:
 BeanFactory是spring中比较原始,比较古老的Factory。因为比较古老,所以BeanFactory无法支持spring插件,例如:AOP、Web应用等功能。

ApplicationContext
 ApplicationContext是BeanFactory的子类,因为古老的BeanFactory无法满足不断更新的spring的需求,于是ApplicationContext就基本上代替了BeanFactory的工作,以一种更面向框架的工作方式以及对上下文进行分层和实现继承,并在这个基础上对功能进行扩展:

  • MessageSource, 提供国际化的消息访问
  • 资源访问(如URL和文件)
  • 事件传递
  • Bean的自动装配
  • 各种不同应用层的Context实现

2. 利用BeanFactory获取bean

//XmlBeanFactory是典型的BeanFactory。
 BeanFactory factory = new XmlBeanFactory("XXX.xml");
 //获取一个叫做mdzz的bean。在这个时候进行实例化。
 factory.getBean("mdzz");

重点:当我们使用BeanFactory去加载XML的时候,我们只是实例化了该容器,而该容器中的bean并没有被实例化。当我们getBean的时候,才会实时实例化该bean对象。

3. 利用ApplicationContext获取bean

//当我们实例化XXX.xml的时候,该文件中配置的bean都会被实例化。(该bean scope是singleton)
ApplicationContext appContext = new ClassPathXmlApplicationContext("XXX.xml");

 重点:当我们使用ApplicationContext去获取bean的时候,在加载XXX.xml的时候,会创建所有的配置bean。

4. 三种获取ApplicationContext对象引用的方法

/第一种加载方法,加载的是classpath下的配置文件。
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//第二种加载方法,加载的是磁盘路径下的文件。
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("applicationContext.xml");
//第三种加载方法,XmlWebApplicationContext,从web系统中加载。

//得到配置文件后,就能拿到想要的对象。例如:
HelloService helloService = (HelloService) applicationContext.getBean("userService");
//在这当中getBean中的参数为你在配置文件下,这个对象的id,一个标识。

5. 区别总结

  • 如果使用ApplicationContext,如果配置的bean是singleton,那么不管你有没有或想不想用它,它都会被实例化。好处是可以预先加载,坏处是浪费内存。
  • BeanFactory,当使用BeanFactory实例化对象时,配置的bean不会马上被实例化,而是等到你使用该bean的时候(getBean)才会被实例化。好处是节约内存,坏处是速度比较慢。多用于移动设备的开发。
  • 没有特殊要求的情况下,应该使用ApplicationContext完成。因为BeanFactory能完成的事情,ApplicationContext都能完成,并且提供了更多接近现在开发的功能。

6. 源码

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver
public interface EnvironmentCapable {

	/**
	 * Return the {@link Environment} associated with this component.
	 */
	Environment getEnvironment();

}

 1. ResourcePatternResolver extends ResourceLoader: 增加以通用方式加载文件资源的能力
    2. ApplicationEventPublisher: 注册侦听器发布事件的能力(SpringBoot 中发布ApplicationEventPublisher,监听ApplicationEvent 异步操作_程序和我有一个能跑就行了-CSDN博客_applicationeventpublisher
    3. MessageSource:解析消息的能力,支持国际化
    4. HierarchicalBeanFactory:
    6. ListableBeanFactory:访问应用程序组件的Bean工厂方法
    6. EnvironmentCapable: 使SpringContext可以拿到Java和OS的环境变量

	public  static void main(String args[]) {

		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		//Object customer = applicationContext.getBean("customer");
		
		AbstractEnvironment a = (AbstractEnvironment)applicationContext.getEnvironment();
		//拿到所有Java的属性
		Map<String, Object>  systemProperty = a.getSystemProperties();	
		systemProperty.keySet().forEach(key->{System.out.println(key+"=="+(String)systemProperty.get(key));});
		//拿到所有环境变量的属性
		Map<String, Object>  systemEnv =  a.getSystemEnvironment();
		systemEnv.keySet().forEach(key->{System.out.println(key+"=*="+(String)systemEnv.get(key));});
		
	}

  


 

 

 

posted on 2021-06-28 11:21  清凤  阅读(203)  评论(0编辑  收藏  举报