文档库 最新最全的文档下载
当前位置:文档库 › spring bean调用的三种实现方式以及区别

spring bean调用的三种实现方式以及区别

三种方式得到Bean并进行调用
1.使用BeanWrapper
HelloWorld hw=new HelloWorld();
BeanWrapper bw=new BeanWrapperImpl(hw);
bw.sePropertyvalue("msg","HelloWorld");
System.out.println(bw.getPropertyCalue("msg"));

2.使用BeanFactory
InputStream is=new FileInputStream("config.xml");
XmlBeanFactory factory=new XmlBeanFactory(is);
HelloWorld hw=(HelloWorld)factory.getBean("HelloWorld");
System.out.println(hw.getMsg());

3.使用ApplicationContext
ApplicationContext ac=new FileSystemXmlApplicationContext("config.xml");
HelloWorld hw=(HelloWorld)ac.getBean("HelloWorld");
System.out.println(hw.getMsg());


BeanFactory 和 ApplicationContext的区别
BeanFacotry接口提供了配置框架及基本功能,无法支持spring的aop功能和web应用。而ApplicationContext接口作为BeanFacotry的派生。因而提供了BeanFactory所有的功能,而且Applicationcontext还在功能上做了扩展,相较于BeanFactory,applicationContext还提供了一下的功能

1提供国际化的消息访问
2提供资源访问
3事件传播特性,即支持aop特性
4能够载入多个上下文,使得每个上下文都专注于一个特定的层面,比如web应用

1.利用MessageSource进行国际化
BeanFactory是不支持国际化功能的,因为BeanFactory没有扩展Spring的MessageResource接口。由于ApplicationContext扩展了MessageResource接口,因为具有消息处理功能的能力

2.对web应用的支持
BeanFactory通常以编程的方式来创建BeanFactory实例,ApplicationContext能以声明的方式创建,如使用ContextLoader,当然也可以使用ApplicationContext的编程来创建ApplicationContext实例

3.资源访问
由于ApplicationContext扩展了ResourceLoader接口,开发人员可以直接使用getResource()方法并指定资源文件的URL来进行存取。可以通过虚拟路径来读取资源文件
也可以通过实际路径来读取,还可以通过相对路径来读取,用来加载多个Resource,而BeanFactory没有扩展ResourceLoader

4.对Aop的支持
application中的事件处理时通过ApplicationEvent类和ApplicationListener接口来提供的,通过ApplicationContext的publicEvent()方法来通知applicationListener。
通过继承ApplicationEventPublisher接口,由ApplicationContext的实现类实现该接口中的publishEvent(ApplicationEvent event);方法来实现事件机制的调用

其他区别
BeanFactory采用的是延迟加载的形式来注入Bean的,即只有在使用到某个Bean时才对该Bean进行加载实例化,这样,我们在容器创建并启动时就不能发现一些存在的Spring的配置问题,而ApplicationContext则相反,它是在容器启动时,就一次性创建了所有的Bean,这样,在容器启动时,我们就可以发现Spring中存在的配置问题

BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间

的区别是:BeanFactory需要手动注册,
使用addBeanPostProcessor(bean)进行显式注册而ApplicationContext则是在IoC容器中通过定义来进行自动注册,BeanPostProcessor主要有两个方法postProcessAfterInitilalization和postProcessBeforeInitiaization对数据进行处理
It's my great honor to introduce myself to you


相关文档