131.Spring 是什么?
他解决的是业务逻辑层和其他各层的松耦合问题,
因此它将面向接口的编程思想
贯穿整个系统应用.
Spring 是一个轻量级的 IoC 和 AOP 容器框架.
目的是解决企业应用开发的复杂性,
使用基本的 JavaBean 来完成
以前只可能由 EJB 完成的事情,
并提供了更多的企业应用功能,
Spring 的用途不仅限于服务器端的开发,
从简单性,
可测试性和松耦合的角度而言,
任何 Java 应用都可以从 Spring 中受益.
132. 说说 Spring 的优点?
1.spring 属于低侵入式设计,
代码的污染极低;
2.spring 的 DI 机制降低了
业务对象替换的复杂性;
3. 容器提供了 AOP 技术,
利用它很容易实现如权限拦截,
运行期监控等功能;
4. 降低了组件之间的耦合性 ,
实现了软件各层之间的解耦;
5. 容器提供单例模式支持;
6. 可以使用容器提供的众多服务,
如事务管理, 消息服务等;
7. 容器提供了众多的辅助类,
能加快应用的开发;
8.spring 对于主流的应用框架提供了集成支持,
如 hibernate,JPA,Struts 等
9. 独立于各种应用服务器
10.Spring 的高度开放性,
并不强制应用完全依赖于 Spring,
开发者可以自由选择 spring 的部分或全部.
133. 说说你对 Spring 的 IoC 与 DI 的理解
(1)IoC 就是控制反转.
就是对象的创建权反转交给 Spring,
由容器控制程序之间的依赖关系,
作用是实现了程序的解耦合,
而非传统实现中,
由程序代码直接操控.
(依赖)控制权由应用代码本身转到了外部容器,
由容器根据配置文件去创建实例
并管理各个实例之间的依赖关系,
控制权的转移,
是所谓反转,
并且由容器动态的将某种依赖关系注入到组件之中.
BeanFactory 是 Spring IoC 容器的具体实现与核心接口,
提供了一个先进的配置机制,
使得任何类型的对象的配置成为可能,
用来包装和管理各种 bean.
2. 最直观的表达就是,
IoC 让对象的创建不用去 new 了,
可以由 spring 自动生产,
这里用的就是 java 的反射机制,
通过反射在运行时动态的去创建,
调用对象.
spring 就是根据配置文件
在运行时动态的去创建对象,
并调用对象的方法的.
3.Spring 的 IoC 有三种注入方式 :
第一是根据属性注入, 也叫 set 方法注入;
第二种是根据构造方法进行注入;
第三种是根据注解进行注入.
详细的说:
IoC 控制反转:
将对象交给容器管理,
你只需要在 spring 配置文件总配置相应的 bean,
以及设置相关的属性,
让 spring 容器生成类的实例对象以及管理对象.
在 spring 容器启动的时候,
spring 会把你在配置文件中配
置的 bean 都初始化以及装配好,
然后在你需要调用的时候,
就把它已经初始化好的那些 bean
分配给你需要调用这些 bean 的类.
就是将对象的控制权反转给 spring 容器管理.
DI 机制(Dependency Injection, 依赖注入):
可以说是 IoC 的其中一个内容,
在容器实例化对象的时候
主动的将被调用者(或者说它的依赖对象)
注入给调用对象.
比如对象 A 需要操作数据库,
以前我们总是要在 A 中
自己编写代码来获得一个 Connection 对象,
有了 spring 我们就只需要告诉 spring,
A 中需要一个 Connection,
至于这个 Connection 怎么构造,
何时构造,
A 不需要知道.
在系统运行时,
spring 会在适当的时候制造一个 Connection,
然后像打针一样, 注射到 A 当中,
这样就完成了对各个对象之间关系的控制.
134. 解释 Spring 支持的几种 bean 的作用域
Spring 容器中的 bean 可以分为 5 个范围:
1.singleton: 这种 bean 范围是默认的,
这种范围确保不管接受到多少个请求,
每个容器中只有一个 bean 的实例,
单例的模式由 bean factory 自身来维护.
2.prototype: 原形范围与单例范围相反,
为每一个 bean 请求提供一个实例.
3.request: 在请求 bean 范围内
会每一个来自客户端的网络请求创建一个实例,
在请求完成以后,
bean 会失效并被垃圾回收器回收.
4.Session: 与请求范围类似,
确保每个 session 中有一个 bean 的实例,
在 session 过期后,
bean 会随之失效.
5.global-session:
global-session 和 Portlet 应用相关.
当你的应用部署在 Portlet 容器中工作时,
它包含很多 portlet.
如果你想要声明让所有的 portlet
共用全局的存储变量的话,
那么这全局变量需要存储在 global-session 中.
全局作用域与 Servlet 中的 session
作用域效果相同.
135.BeanFactory 接口和 ApplicationContext 接口有什么区别 ?
BeanFactory 和 ApplicationContext
是 Spring 的两大核心接口,
而其中 ApplicationContext 是 BeanFactory 的子接口.
它们都可以当做 Spring 的容器,
生成 Bean 实例的,
并管理容器中的 Bean.
1.BeanFactory:
是 Spring 里面最底层的接口,
提供了最简单的容器的功能,
负责读取 bean 配置文档,
管理 bean 的加载与实例化,
维护 bean 之间的依赖关系,
负责 bean 的生命周期,
但是无法支持 spring 的 aop 功能和 web 应用.
2.ApplicationContext 接口
作为 BeanFactory 的派生,
因而具有 BeanFactory 所有的功能.
而且 ApplicationContext 还在功能上做了扩展,
以一种更面向框架的方式工作以及对上下文进行分层和实现继承,
相较于 BeanFactorty,
ApplicationContext 还提供了以下的功能:
1默认初始化所有的 Singleton, 也可以通过配置取消预初始化.
2继承 MessageSource, 因此支持国际化.
3资源访问, 比如访问 URL 和文件.
4事件机制.
5同时加载多个配置文件.
6以声明式方式启动并创建 Spring 容器.
7载入多个 (有继承关系) 上下文 ,
使得每一个上下文
都专注于一个特定的层次,
比如应用的 Web 层.
BeanFactroy 采用的是延迟加载形式
来注入 Bean 的,
即只有在使用到某个 Bean 时(调用 getBean()),
才对该 Bean 进行加载实例化,
这样, 我们就不能发现一些存在的 Spring 的配置问题.
如果 Bean 的某一个属性没有注入, B
eanFacotry 加载后,
直至第一次使用调用 getBean 方法
才会抛出异常.
而 ApplicationContext 则相反,
它是在容器启动时,
一次性创建了所有的 Bean.
这样, 在容器启动时,
我们就可以发现 Spring 中存在的配置错误,
这样有利于检查所依赖属性是否注入.
ApplicationContext 启动后
预载入所有的单实例 Bean,
通过预载入单实例 bean ,
确保当你需要的时候,
你就不用等待,
因为它们已经创建好了.
相对于基本的 BeanFactory,
ApplicationContext 唯一的不足是
占用内存空间.
当应用程序配置 Bean 较多时,
程序启动较慢.
BeanFactory 通常以编程的方式被创建,
ApplicationContext 还能以声明的方式创建,
如使用 ContextLoader.
BeanFactory 和 ApplicationContext
都支持 BeanPostProcessor,
BeanFactoryPostProcessor 的使用,
但两者之间的区别是:
BeanFactory 需要手动注册,
而 ApplicationContext 则是自动注册.
来源: http://www.jianshu.com/p/4edc3b0527e8