Spring的优点
- 轻量级、非侵入式,对现有的类结构没有影响。
- 可以提供众多服务,如事物管理,WebServices等。
- AOP的很好支持,方便面向切面编程,使得业务逻辑和系统服务分开
- 对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等,像粘合剂把一些好的框架粘合在一起方便实用
- 使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
- Spring DI机制降低了业务对象替换的复杂性。
- Spring 的高度开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
Spring的缺点
- 缺少一个公用控制器
- 没有SpringBoot好用
- Spring像一个胶水,将框架粘在一起,后面拆分的话就不容易拆分了
IOC
-
传统Java SE程序设计是在对象内部通过new去创建对象,是程序主动创建依赖对象。
-
IOC是有专门的一个容器来创建这些对象,即由IOC容器来控制对象的创建。
-
反转:由容器帮我们查找及注入依赖对象,对象只是被动地接受依赖对象,由对象主动反转为了容器主动。
-
谁依赖谁?为什么需要依赖?谁注入谁?注入了什么?
- 应用程序依赖于IOC容器。
- 应用程序需要IOC容器来提供对象需要的外部资源。
- IOC容器注入应用程序某个对象,应用程序依赖的对象。
- 注入了某个对象所需要的外部资源(包括对象、自愿、常量数据)。
-
IOC和DI是对同一概念的不同描述。
如何理解IOC容器?
比如我是应用程序,我需要一个对象,我之前都是自己去找这个对象,我需要找一个我喜欢的类型,有各种条件,比如有车、有房、长得好看、没爹没娘,但是找起来很费劲。现在IOC容器就相当于婚介所,我这个类在婚介所登记之后,它会替我照着要求去找这个对象,那我就被动接受就好了。
如何理解DI?
DI实现了IOC在系统运行时动态地提供对象。底层是Java反射,允许在运行时动态地生成对象、执行对象的方法、改变对象的属性。
IOC的意义在于解耦,对象不再自己创建对象,这样会对创建对象有着很强的依赖性,现在对象都交由IOC容器来控制,依赖关系变为由IOC容器建立。
Bean
Bean的作用范围
- singleton:单例模式,默认,不管收到多少个Bean请求,每个容器中只有唯一一个Bean实例。
- prototype:原型模式,与singleton相反,每次Bean请求都会创建一个新的实例。
- request:每次HTTP请求都会创建一个新的Bean并把它收到request域中,在请求完成后Bean会失效并被垃圾回收器回收。
- session:和request类似,确保每个session中有一个Bean实例,session过期后bean会随之失效。
- global session:当应用部署在Portlet容器时,如果想让所有Portlet共享全局存储变量,那么该变量需要存储在global session中。
Spring框架中Bean的生命周期
- Spring容器从XML文件中取bean的定义,并实例化bean。
- Spring根据bean的定义填充所有的属性。
- 如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
- 如果Bean实现了BeanFactoryAware接口,Spring传递beanFactory给setBeanFactory方法。
- 如果有任何与bean相关的BeanPostProcessors,Spring会在postProcesserBeferInitialization方法内调用它们。
- 如果bean实现intializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
- 如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization方法将被调用。
- 如果bean实现了DisposableBean,它将调用destroy方法。
Spring框架中用到了哪些设计模式
- 代理模式:在AOP和remoting中被用的比较多。
- 单例模式:在spring配置文件中定义的bean默认为单例模式。
- 模板方法:用来解决代码重复问题,比如RestTemplate、JMSTemplate、JPATemplate。
- 前端控制器:Spring提供了DispatcherServlet来对请求进行分发。
- 视图帮助(View Helper):Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
- 依赖注入:贯穿于BeanFactory/ApplicationContext接口的核心理念。
- 工厂模式:BeanFactory用来创建对象的实例。