Spring概念比较

一、BeanFactory vs ApplicationContext Reference Bean Factoryweb

Bean instantiation/wiring

Application Contextsession

1. Bean instantiation/wiring
2. Automatic BeanPostProcessor registration
3. Automatic BeanFactoryPostProcessor registration
4. Convenient MessageSource access (for i18n)
5. ApplicationEvent publication

So if you need any of the points presented on the Application Context side, you should use ApplicationContext.app

BeanFactory只是提供最基本的功能,ApplicationContext继承了不少的接口,提供更多的高级功能。 类图以下:ide

输入图片说明

2.ClassPathXmlApplicationContext vs FileSystemXmlApplicationContextthis

参考一 参考二spa

  1. ClassPathXmlApplicationContext will read files from your classpath. They must be in classesfolder of your web application or in a jar in your libfolder.code

  2. FileSystemXmlApplicationContext can access all your file system, for example c:/config/applicationContext.xml.xml

  3. XmlWebApplicationContext certainly can access to files contained in your web application, but this is not the most important thing. It implements WebApplicationContext and this means that it will detect ServletContextAware beans, register custom scopes (request, session, ...) among other things.对象

可加载文件的位置不一样,ClassPathXmlApplicationContext读取文件从classpath下。继承

FileSystemXmlApplicationContext 可读取文件系统中的任何位置。

XmlWebApplicationContext 访问Web容器的目录下

3.构造注入和setter注入比较

他们的执行效果与设值注入的执行效果同样。可是仍是有点却别:建立Person实例中Axe的属性时机不一样—设值注入式先经过无参数的构造器建立一个Bean实例,而后调用它的setter方法注入依赖关系,而构造注入则是直接调用有参数的构造器,当Bean实例建立完成后,依赖关系也已经完成。

构造注入的缺点: 若是涉及到注入比较多,构造器注入传入参数比较多,会显得比较臃肿,因此仍是首推setter注入。

构造注入的优势: 构造注入能够在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。例如,组件中其余依赖关系的注入,经常要依赖于DataSrouce的注入。采用构造注入,能够在代码中清晰的决定注入顺序。

对于依赖关系无需变化的Bean,构造注入更有用处。由于没有Setter方法,全部的依赖关系所有在构造器内设定。所以,无需担忧后续的代码对依赖关系产生破坏。

 建议:采用以设值注入为主,构造注入为辅的注入策略。对于依赖关系无需变化的注入,尽可能采用构造注入;而其余的依赖关系的注入,则考虑采用设值注入。

请注意如下明显的区别:

在设值注入方法支持大部分的依赖注入,若是咱们仅须要注入int、string和long型的变量,咱们不要用设值的方法注入。对于基本类型,若是咱们没有注入的话,能够为基本类型设置默认值。在构造方法注入不支持大部分的依赖注入,由于在调用构造方法中必须传入正确的构造参数,不然的话为报错。 设值注入不会重写构造方法的值。若是咱们对同一个变量同时使用了构造方法注入又使用了设置方法注入的话,那么构造方法将不能覆盖由设值方法注入的值。很明显,由于构造方法尽在对象被建立时调用。 在使用设值注入时有可能还不能保证某种依赖是否已经被注入,也就是说这时对象的依赖关系有多是不完整的。而在另外一种状况下,构造器注入则不容许生成依赖关系不完整的对象。 在设值注入时若是对象A和对象B互相依赖,在建立对象A时Spring会抛出sObjectCurrentlyInCreationException异常,由于在B对象被建立以前A对象是不能被建立的,反之亦然。因此Spring用设值注入的方法解决了循环依赖的问题,因对象的设值方法是在对象被建立以前被调用的。

相关文章
相关标签/搜索