Spring概述
Spring是个java企业级应用的开源开发框架。Spring主要用来开发java应用,但是有些拓展是针对构建J2EE平台的web应用。Spring框架的目的是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
使用Spring框架的好处
- 轻量: Spring是轻量的,基本的版本大约2MB。
- 控制反转: Spring通过控制反转实现了松散耦合,对象们给出他们的依赖,而不是创建或者查找依赖的对象们。
- 面向切面编程: Spring支持面向切面编程,并把应用业务逻辑和系统服务分开。
- 容器: Spring包含并管理应用中对象的生命周期和配置。
- MVC框架: Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的代替品。
- 事务管理: Spring提供一个持续的事务管理接口,可以拓展到上至本地服务下至全局事务(JTA)。
- 异常处理: Spring提供方便的API把具体技术相关的异常(比如JDBC、Hibernate or JDO抛出的)转化为一致的unchecked异常。
Spring由哪些模块组成
- Core Container - 核心容器
- spring - core:Spring中的核心工具类包
- spring - beans:Spring中定义bean的组件
- spring - context:Spring的运行容器
- spring - context - support:Spring容器的扩展支持
- spring - expression:Spring的表达式语言支持
- AOP - 面向切面编程
- spring - aop:基于代理的AOP支持
- spring - aspects:集成Aspects的AOP支持
- WEB(MVC)
- spring - web:提供web的基础功能
- spring - webmvc:提供springmvc的功能
- spring - websocket:提供web socket支持
- spring - webmvc - portlet:提供Portlet环境的支持
- Data Access/Integration - 数据访问 / 集成
- spring - jdbc:提供对jdbc连接的封装功能
- spring - tx:提供对事物的支持
- spring - orm:提供对象 - 关系映射支持
- spring - oxm:提供对象 - XML映射支持
- spring - jms:提供消息队列的支持
- Test - 测试
- spring -test:提供对测试功能的支持
核心容器(应用上下文)模块
这是基本的Spring模块,提供spring框架的基础功能,BeanFactory是任何以spring为基础的应用的核心。
Spring框架建立在此模块之上,它使Spring成为一个容器。
BeanFactory - BeanFactory实现举例
Bean工厂是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从真正的应用代码中分离。最常用的BeanFactory实现是XmlBeanFactory类。
XMLBeanFactory
常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根据XML文件中的定义加载beans。该容器从XML文件读取配置元数据并用它去创建一个完全配置的系统或者应用。
AOP模块
AOP模块用于发给我们的Spring应用做面向切面的开发,很多支持由AOP联盟提供,这样就确保了Spring和其他AOP框架的共同性。这个模块将元数据编程引入Spring。
JDBC抽象和DAO模块
通过使用JDBC抽象和DAO模块,保证数据库代码的简洁,并能避免数据库源错误关闭导致的错误,它在各种不同的数据库的错误信息之上,提供了一个统一的异常访问层。它还利用Spring的AOP模块给Spring应用中的对象提供事务管理服务。
对象 / 关系映射集成模块
Spring通过ORM谋爱,支持我们在直接JDBC之上使用一个对象 / 关系映射的映射工具,Spring支持集成主流的ORM框架,如Mybatis、Mybatis-Plus等。Spring 的事物管理同样支持所有的ROM框架及JDBC。
WEB模块
Spring的WEB模块是构建在application context模块基础之上,提供一个适合web应用的上下文。这个模块也包括支持多种面向web的任务,如透明地处理多个文件上传请求和程序级请求参数的绑定到你的业务对象。它也有对Jakarta Struts的支持
Spring配置文件
Spring配置文件是个xml文件,这个文件包含了类信息,描述了如何配置它们,以及如何相互调用。
Spring IOC容器
Spring IOC负责创建对象、管理对象(通过依赖注入 - Dependency Injection)、装配对象、配置对象,并且管理这些对象的生命周期。
通俗的理解,许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我们把new类B的事情交给spring来做,在我们调用的时候,容器会为我们实例化。
Spring IOC容器容器的初始化过程
资源定位,即定义bean的xml →→ 载入 →→ IOC容器注册,注册beanDefinition。
IOC容器的初始化过程,一般不包含bean的依赖注入的实现,在spring IOC设计中,bean的注册和依赖注入是两个过程,,依赖注入一般发生在应用第一次索取bean的时候,但是也可以在xm中配置,在容器初始化的时候,这个bean就完成了初始化。
Spring IOC的优点是什么
IOC或依赖注入(DI)把应用代码量降到最低。它使应用容易测试,单元测试不再需要单例和JNDI查找机制。
最小的代价和最小的侵入性使松耦合得以实现。IOC通气支持加载服务时的饿汉式初始化和懒加载。
ApplicationContext通常的实现是什么
- File SystemXmlApplicationContext: 此容器从一个XML文件中加载beans的定义,XML Bean配置文件的全路径名称必须提供给它的构造函数。
- ClassPathXmlApplicationContext: 此容器也从一个XML文件中加载beans的定义,这里,你需要正确设置classpath因为这个容器将在classpath里找bean配置。
- WebXmlApplicationContext: 此容器加载一个XML文件,此文件定义了一个WEB应用的所有bean。
Bean工厂和Application contexts有什么区别
Application contexts提供一种方法处理文本消息,一个通常的做法是加载文件资源,它们可以注册为监听器的bean发布事件。另外,在容器或容器内的对象上执行的那些不得不由bean工厂以程序化方式处理的操作,可以在Application contexts中以声明的方式处理。Application contexts实现了MessageSource接口,该接口的实现以可插拔的方式提供湖区本地化消息的方法。
依赖注入
什么是Spring的依赖注入
依赖注入,是IOC的一个方面。通俗的理解,许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我们把new类B的事情交给spring来做,在我们调用的时候,容器会为我们实例化。
有哪些不同类型的IOC(依赖注入)方式
- 构造方法: 通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
- Setter方法注入: Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
- 基于注解的注入: 我们常用的是基于注解的注入
Spring Beans
什么是Spring Beans
Spring Beans是那些形成Spring应用主干的java对象。它们被Spring IOC容器初始化、装配和管理。这些beans通过容器中配置的元数据创建。比如XML文件中< bean />的形式定义。
Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,如果它被赋为TRUE,bean 就是单件,否则就是一个 prototype bean。默认是TRUE,所以所有在Spring框架中的beans 缺省都是单件。
一个Spring Bean定义 包含什么
一个Spring bean的定义包含容器必知的所有配置元数据,包括如何创建一个bean,它的生命周期详情及依赖。
如何给Spring容器提供配置元数据
- XML配置文件
- 基于注解的配置
- 基于java的配置
你怎么定义类的作用域
作用域 | 当前类 | 同包下 | 不同包下 | 其它包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | |
defaule | √ | √ | ||
private | √ |
- public: 公共的,可以供所有的类访问
- protected: 保护的,可以供同包下的类访问,子孙类不在同包中也可以访问
- defaule: 默认的,不写任何访问修饰符时,可以供同包下的访问
- private: 私有的,只供本类访问
作用域范围从大到小:public、protected、defaule、private
Spring框架中的单例bean是线程安全的吗
一般的Web应用划分为展现层、服务层和持久层三个层次,在不同的层中编写对应的逻辑,下层通过接口向上层开放功能调用。在一般情况下,从接收请求到返回响应所经过的所有程序调用都同属于一个线程
ThreadLocal是解决线程安全问题一个很好的思路,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
线程安全问题都是由全局变量及静态变量引起的。
无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象 .不能保存数据,是不变类,是线程安全的。
当然也可以通过加sync锁的方法来解决线程安全,这种以时间换空间的场景在高并发场景下显然是不实际的。
Spring框架中bean的生命周期
- step1 Spring IoC容器找到关于Bean的定义并实例化该Bean。
- step2 Spring IoC容器对Bean进行依赖注入。
- step3 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
- step4 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
- step5 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
- step6 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
- step7 如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
- step8 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
Sprig 面向切面编程(AOP)
面向切面编程(AOP)
面向切面的编程,或AOP, 是一种编程技术,允许程序模块化横向切割关注点,或横切典型的责任划分,如日志和事务管理。
Aspect 切面
AOP核心就是切面,它将多个类的通用行为封装成可重用的模块,该模块含有一组API提供横切功能。比如,一个日志模块可以被称作日志的AOP切面。根据需求的不同,一个应用程序可以有若干切面。在Spring AOP中,切面通过带有@Aspect注解的类实现。
在Spring AOP 中,关注点和横切关注的区别是什么
- 关注点: 是应用中一个模块的行为,一个关注点可能会被定义成一个我们想实现的一个功能。
- 横切关注点: 是一个关注点,此关注点是整个应用都会使用的功能,并影响整个应用,比如日志,安全和数据传输,几乎应用的每个模块都需要的功能。因此这些都属于横切关注点。
连接点 是什么
连接点代表一个应用程序的某个位置,在这个位置我们可以插入一个AOP切面,它实际上是个应用程序执行Spring AOP的位置。
通知 是什么
通知是个在方法执行前或执行后要做的动作,实际上是程序执行时要通过SpringAOP框架触发的代码段。
Spring切面可以应用五种类型的通知:
- before: 前置通知,在一个方法执行前被调用。
- after: 在方法执行之后调用的通知,无论方法执行是否成功。
- after-returning: 仅当方法成功完成后执行的通知。
- after-throwing: 在方法抛出异常退出时执行的通知。
- around: 在方法执行之前和之后调用的通知。
切点 是什么
切入点是一个或一组连接点,通知将在这些位置执行。可以通过表达式或匹配的方式指明切入点。
什么是目标对象
被一个或者多个切面所通知的对象。它通常是一个代理对象。也指被通知(advised)对象。
什么是织入。什么是织入应用的不同点
织入是将切面和到其他应用类型或对象连接或创建一个被通知对象的过程。
织入可以在编译时,加载时,或运行时完成。
解释基于注解的切面实现
在这种情况下(基于@AspectJ的实现),涉及到的切面声明的风格与带有java5标注的普通java类一致。
Spring 的MVC
什么是Spring的MVC框架?
Spring 配备构建Web 应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts,Spring 的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。
DispatcherServlet
Spring的MVC框架是围绕DispatcherServlet来设计的,它用来处理所有的HTTP请求和响应。
WebApplicationContext
WebApplicationContext 继承了ApplicationContext 并增加了一些WEB应用必备的特有功能,它不同于一般的ApplicationContext ,因为它能处理主题,并找到被关联的servlet。
什么是Spring MVC框架的控制器?
控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。
不负韶华,只能朝夕