文章目录
Spring的组成
- Spring是一个轻量级框架,可以一站式构建企业级应用。
- Spring的模块可以分为6个
- Core Container(Spring的核心)【重要】
- AOP(面向切面编程)【重要】
- Web(主要是Spring MVC)【重要】
- Messaging(发送消息的组件)
- Data Access / Integration(数据访问和集成)
- Test(Spring 测试,包含Junit)
Spring中Bean的作用域
- Spring早期的时候(1.x)
- singleton:单例模式。
- prototype:原型模式,每次从容器中调用Bean时,都会返回一个新的实例。
- Spring 2.x
- request:每次HTTP请求都会创建一个新的Bean
- session:同一个HttpSession共享同一个Bean;不同的HttpSession使用不同的Bean。
- globalSession:同一个全局Session共享一个Bean。
BeanFactory 和 ApplicationContext 的不同点
- BeanFactory是Spring容器的root接口。懒加载,意味着只有在调用 getBeans()方法直接调用时才进行实例化bean。
- ApplicationContext 是 Spring 应用程序的中央接口,用于向应用程序提供配置信息。继承了BeanFactory 接口,所以 ApplicationContext 包含 BeanFactory的所有以及更多的功能。主要功能是支持大型业务应用的创建。
- 与 BeanFactory 懒加载的方式不同,ApplicationContext 是预加载,所以,每一个 bean 都在 ApplicationContext 启动之后实例化
- 总结:ApplicationContext 包含 BeanFactory 的所有特性,通常推荐使用前者。但是也有一些限制情形,比如移动应用内存消耗比较严苛,在那些情景中,使用更轻量级的 BeanFactory 是更合理的。然而,在大多数企业级的应用中,ApplicationContext 是你的首选。
Spring中Bean的生命周期
- 通常是指ApplicationContext中的Bean的生命周期(ApplicationContext提供的方法更丰富)
IoC(Inversion of Control)控制反转、DI(Dependency Injection)依赖注入
-
IOC:由容器来创建对象并管理对象之间的依赖关系 。
- 对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。
- 通俗的讲就是,在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过 DI 实现的。
- 举个栗子:对象A需要操作数据库,以前我们总是要在A中编写代码来获得一个Connection对象,有了 spring 我们就只需要告诉 spring,A中需要一个 Connection,至于这个 Connection 怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection 才能正常运行,而这个 Connection是由 spring 注入到A中的,依赖注入的名字就是这么来的。
- 目的:1. 降低类之间的耦合。2. 倡导面向接口编程,实施依赖倒换原则。3. 提高系统可插入,可测试,可修改等特性。
- 具体做法:
- 将bean之间的依赖关系尽可能的转换为关联关系;
- 将具体类的关联尽可能的转换为对Java interface的关联,而不是与具体的服务对象相关联。
- 由IoC(容器)根据配置信息,实例化具体bean类、将bean之间的依赖关系注入进来。
-
DI:由容器动态的将某种依赖注入到组件之中。
- 如何实现:反射!它允许程序在运行的时候动态生成对象、执行对象的方法、改变对象的属性。spring就是通过反射来实现注入的。
- 依赖注入可以通过 setter 注入、构造器注入和接口注入三种方式实现,Spring支持setter注入和构造器注入。构造器注入需要注入依赖关系,settter注入需要类提供无参构造器或者无参的静态工厂方法来创建对象。
AOP(Aspect Oriented Programming)面向切面编程
- 可以说是OOP(Object Oriented Programming)面向对象编程 的补充和完善。它利用一种称为 横切的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为
Aspect
,即 切面。简单来说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,有利于未来的可操作性和可维护性。 - 原理:(动态代理)AOP实现的关键在于AOP框架自动创建的AOP代理,AOP代理主要分为静态代理和动态代理,静态代理的代表为AspectJ;而动态代理则以Spring AOP为代表。通常使用AspectJ的编译时增强实现AOP,AspectJ是静态代理的增强,所谓的静态代理就是AOP框架会在编译阶段生成AOP代理类,因此也称为编译时增强。
- 应用场景:Authentication 权限,Caching 缓存,Context passing 内容传递,Error handing 错误处理,Lazy loading 懒加载,DeBugging 调试,Persistence 持久化,Resource pooling 资源池,Synchronization 同步,Transactions 事务。
Spring事务管理
- Spring支持 声明式事务和编程式事务,Spring默认声明式事务,因为这种方式和应用程序的关联较少,更符合轻量级容器的概念。声明式事务管理优于编程式事务,灵活方面不如编程式事务,编程式事务允许通过代码控制业务。
- 事务分为全局事务和局部事务,全局事务由应用服务器管理,需要底层服务器JTA支持(如WebLogic、WildFly等)。局部事务和底层采用持久化方案有关,例如使用JDBC时,需要使用Connection对象来操作事务;而采用Hibernate进行持久化时,需要使用Session对象来操作事务。
Spring的优点
- 非侵入式框架:其目标是使应用程序代码对框架的依赖最小化,应用代码可以在没有Spring或者其他容器的情况下运行。
- 提供了一个一致的编程模型,使应用直接使用POJO开阿发,从而可以使运行环境隔离开来。
- 推动应用的设计风格向面向对象及面向接口编程转变,提高了代码的重用性和可测试性。
@Autowired和@Resource
-
共同点
- 两者都可以写在字段上和setter方法上。两者如果都写在字段上,就不需要再写setter方法。
-
不同点
-
@Autowired:是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,需要设置它的requried属性为false。如果我们想要使用按照名称(byName)来装配,可以结合**@Qualifier**一起使用。
-
@Resource:是按照名称(byName)自动注入的。@Resource有两个重要属性:name和type,Spring将@Resource注解的name属性解析为bean的名字,type属性解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
-
持久层
- 含义:所谓持久就是将数据保存到可掉电式储存设备中以便今后使用,简单地说,就是将内存中的数据保存到关系型数据库、文件系统、消息队列等提供持久化支持的设备中。持久层就是系统中专注于实现数据持久化的相对独立的层面。
- 目的:
- 数据存储逻辑的分离,提供抽象化的数据访问接口
- 数据访问底层实现的分离,可以在不修改代码的情况下切换底层实现
- 资源管理和调度的分离,在数据访问层实现统一的资源调度(如缓存机制)
- 数据抽象,提供面向对象的数据操作。
SpringMVC
- 客户端所有请求都交给中央控制器
DispatcherServlet
来处理,它负责调用系统的其他模块来真正处理用户的请求。 DispatcherServlet
收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping
的配置找到处理该请求的Handler(即Controller)。- 通过HandlerAdapter对该处理器进行封装。
- HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。
- Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet。
- Dispatcher借助ViewResolver完成从逻辑视图到真实视图的解析工作。
- DispatcherServlet会利用视图对象对模型数据进行渲染。
tcherServlet。 - Dispatcher借助ViewResolver完成从逻辑视图到真实视图的解析工作。
- DispatcherServlet会利用视图对象对模型数据进行渲染。
- 客户端得到响应,可能是一个普通的HTML页面,或者XML、JSON字符串,也有可能是一张图片或PDF文件。