容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理
一、Spring 如何简化Java开发?
为了降低Java开发的复杂性,spring采用以下4种关键策略
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
Spring定义了多种作用域
- 单例(Singleton) :在整个应用中,只创建bean的一个实例。
- 原型(Prototype) :每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的 bean实例。
- 会话(Session) :在Web应用中,为每个会话创建一个bean实例。
- 请求(Rquest) :在Web应用中,为每个请求创建一个bean实例。
单例是默认的作用域。如果选择其他的作用域,要使用@scope注解,它可以与@Component或@Bean一起使用。
二、 依赖注入(DI)
由容器动态的将某个依赖关系注入到组件之中。
① 谁依赖谁? 应用程序依赖于IoC容器。
②为什么需要依赖? 应用程序需要IoC容器来提供对象需要的外部资源。
③谁注入谁? IoC容器注入应用程序某个对象,应用程序依赖的对象。
④注入了什么? 注入某个对象所需要的外部资源(包括对象、资源、常量数据)。
⑤为什么要使用依赖注入? 解耦合(依赖注入降低了依赖和被依赖类型间的耦合)、代码结构更清晰、增加了代码可复用性。
依赖注入的实现方式:
1、构造函数注入
2、setter注入
3、接口注入
控制反转(IOC)和依赖注入(DI)关系?
同一个概念的不同角度描述。控制反转(设计思想),是创建对象的过程被反转了。
以前需要自己手动new创建对象,现在由容器创建,直接获取。
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-oriented programming, AOP)
允许你把遍布应用各处的功能分离出来形成可重用的组件。
这个符合面向对象的思想。打个比方你需要锤子,你可以
1、自己去造。用java的话说就是调用者创建被调用者
2、你可以要找到生产锤子的工厂,向工厂购买即可。对应java的工厂模式。
3、你可以打电话找到卖锤子的商店,让人把锤子送货上门。对应spring的依赖注入
以上第1种办法,要求被调用的Java类出现在调用者的代码里。无法实现二者之间的松耦合
第2种办法,调用者无须关心被调用者具体实现过程,只需要找到符合某种标准(接口)的实例,即可使用
第3种办法,调用者无须自己定位工厂,程序运行到需要被调用者时,系统自动提供被调用者实例。调用者 和被调用者通过spring管理。他们的关系由spring维护
你自己想想,如果拿到的锤子不是你想要的,哪个办法更方便
三、AOP面向切面编程
AOP利用一种“横切”技术,将软件系统分为:核心关注的和横切关注点
横切关注点可以被模块化为特殊的类,这些,类被称为切面(aspect)。
面向切面编程往往被定义为促使软件系统实现关注点的分离一项技术。系统由许多不同的组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志、事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们会跨越系统的多个组件。如果将这些关注点分散到多个组件中去,你的代码将会带来双重的复杂性。
AOP能够使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。所造!成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来复杂性。总之, AOP能够确保POJO的简单性。
在AOP术语中,切面的工作被称为通知。
Spring切面可以应用5种类型的通知:
- 前置通知(Before) :在目标方法被调用之前调用通知功能。
- 后置通知(After) :在目标方法完成之后调用通知,此时不会关心方法的输出是什么。
- 返回通知(After-returning) :在目标方法成功执行之后调用通知。
- 异常通知(After-throwing) :在目标方法抛出导常后调用通知。
- 环绕通知(Around) :通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行。自定义的行为
四、Spring MVC
MVC的全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它是用一种业务逻辑、数据与界面显示分离的方法来组织代码,将众多的业务逻辑聚集到一个部件里面,在需要改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,达到减少编码的时间。
- M即model模型是指模型表示业务规则。
- V即View视图是指用户看到并与之交互的界面。
- C即controller控制器是指控制器接受用户的输入并调用模型和视图去完成用户的需求,控制器本身不输出任何东西和做任何处理。
SpringMVC 处理请求流程:
第一步:用户发送请求到前端控制器(DispatcherServlet)。
第二步:前端控制器请求 HandlerMapping 查找 Handler,可以根据 xml 配置、注解进行查找。
第三步: 处理器映射器 HandlerMapping 向前端控制器返回 Handler
第四步:前端控制器调用处理器适配器去执行 Handler
第五步:处理器适配器执行 Handler
第六步:Handler 执行完成后给适配器返回 ModelAndView
第七步:处理器适配器向前端控制器返回 ModelAndView
ModelAndView 是SpringMVC 框架的一个底层对象,包括 Model 和 View
第八步:前端控制器请求试图解析器去进行视图解析
根据逻辑视图名来解析真正的视图。
第九步:试图解析器向前端控制器返回 view
第十步:前端控制器进行视图渲染
就是将模型数据(在 ModelAndView 对象中)填充到 request 域
第十一步:前端控制器向用户响应结果
DispatcherServlet是Spring MVC的核心。
其他
创建应用组件之间协作的行为通常称为装配(wiring)。Spring有多种装配bean的方式,采用XML是很常见的一种装配方式。
Spring具有非常大的灵活性,它提供了三种主要的装配机制:
- 在XML中进行显式配置
- 在Java中进行显式配置
- 隐式的bean发现机制和自动装配
spring自带了多种类型的应用上下文。下面的几个是你最有可能遇到的。
AnnotationConfigApplicationContext: 从一个或多个基于Java的配置类中加载 Spring应用上下文。AnnotationConfigWebApplicationContext: 从一个或多个基于Java的配置类中加载Spring Web应用上下文。ClassPathXmlApplicationContext: 从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源.
FileSystemXmlapplicationcontext: 从文件系统下的一个或多个XML配置文件中加载上下文定义。
XmlWebApplicationContext: 从Web应用下的一个或多个XMIL配置文件中加载上下文定义。