1、 Spring以一己之力撼动了Sun公司的JavaEE传统重量级框架(EJB),逐渐成为使用最多的JavaEE企业应用开发框架。
2、 Spring是分层的JavaEE应用一站式的轻量级开源框架,以控制反转(Ioc)和面向切面编程(Aspect Oriented Programming AOP)为内核,提供了表现层SpringMVC、持久层SpringJDBC以及业务层事务管理等众多的企业级应用技术。
3、 Spring的使命:简化Java开发。目标是实现一个易于开发、便于测试而又功能齐全的开发框架。
4、 Spring的特点:
- 方便解耦,简化开发:
通过Spring提供的IOC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合;
- AOP编程的支持:
通过Spring提供的AOP功能,用户可以方便地进行面向切面编程,许多不容易用传统面向对象编程(OOP)实现的功能都可以通过AOP轻松应对;
- 声明式事务的支持:
通过Spring的声明式事务灵活地进行事务管理,提高开发效率和质量;
- 方便的程序测试
- 方便集成各种优秀框架
- 降低JavaEE API的使用难度
- Spring源码是经典的学习范例
5、 控制反转:
所谓控制反转,就是通过容器来控制业务对象之间的依赖关系,而非传统实现中,由代码直接操控。
控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。控制权转移带来的好处就是降低了业务对象之间的依赖程度。
6、 依赖注入(DI):IOC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其它对象,这点就是通过DI实现的。
依赖注入是组装应用对象的一种方式,对象无需知道依赖是来自何处或者依赖的实现方式,依赖对象通常只能通过接口了解所注入的对象,这就能确保低耦合。
依赖注入的方式:构造器注入、方法注入、接口注入。
注意:Spring的IOC容器只支持构造器和方法注入。
7、 Spring自带了几种容器的实现,可以归为两种不同类型:
BeanFactory(Bean工厂):是Spring框架最核心的接口,它提供了高级IOC的配置机制。BeanFactory使管理不同类型的java对象成为可能;
ApplicationContext(应用上下文):它是建立在BeanFactory基础之上,提供了更多面向应用的功能。一般称BeanFactory为IOC容器,而称ApplicationContext为应用上下文。
注意:BeanFactory属于底层封装组件,Application是属于上层封装组件,专门供开发者使用。
8、 Spring有三种获取ApplicationContext应用上下文实例的方式:
- ClassPathXmlApplication 从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当作类资源;
- FileSystemXmlApplicationContext 读取文件系统下的XML配置文件并加载上下文定义;
- XmlWebApplicationContext 读取Web应用下的XML配置文件并加载上下文定义;
通过ApplicationContext应用上下文实例调用其getBean()方法从IOC容器中即可获取Bean。
配置里一个<bean>对应一个Bean组件的实例。
9、 装配Bean
所谓装配就是指创建应用对象之间协作关系的行为,这也是依赖注入的本质;
Spring通过配置文件的方式定义Bean以及Bean与Bean之间的依赖关系。Spring的ApplicationContext应用上下文通过加载并解析该配置文件,完成Bean装配工作。
Bean配置信息是Bean的元数据信息,由四个方面组成:实现类(通过反射获得实例)、属性、依赖关系、行为配置(生命范围以及生命周期各过程的回调函数)。
Spring支持多种形式Bean配置方式:基于XML配置、基于注解的配置、基于Java类的配置。
10、构造器注入Bean
<constructor-arg value=””> Spring容器在实例化Bean时不调用默认构造器,而是调用有参构造器。
<constructor-arg ref=””> 当有参构造器的参数类型不全是基本类型而存在引用类型时。
<factory-method>装配单例模式使用静态方法实例化的Bean
11、Bean的作用域
在Spring容器中,所有的Bean默认都是单例。当容器分配一个Bean时,它总是返回Bean的同一个实例。
有时需要每次请求时都获取唯一的Bean实例,则可以为Bean声明一个作用域。
singleton:(单例模式);
prototype:允许Bean的定义可以被实例化任意次;
request:请求;session:会话;global-session:全局HTTPSession,一个Bean定义一个实例。
12、实例化一个Bean时,尽量不要执行一些资源初始化操作,只进行简单的赋初值操作,而将资源初始化的操作放到init方法里去执行,资源清理操作放到destroy方法里。
init-method=”” destroy-method=””
default-init-method default-destroy-method
13、Bean方法注入
<property>,bean组件中必须添加get,set方法。
14、内部Bean注入:
内部Bean的特点是不能被复用,内部Bean仅适用于一次注入,而且不能被其它Bean所引用。
15、Spring支持集合嵌套,即<list>或<set>元素中还可以包含另外一个<list>或<set>作为其成员;Spring支持赋空值,即使用<null/>
16、Spring3.0新特性引入了Spring表达式语言(Spring Expression Language,SpEL)。SpEL是一种强大、简洁的装配Bean的方式,它通过运行期执行的表达式将值装配到Bean的属性或构造器参数中。
SpEL表达式可以引用其他Bean,这与ref属性引用Bean结果相同,而且SpEL表达式还支持引用Bean的属性和方法。
SpEL可以使用T()运算符引用静态类,以及静态类的属性和方法。
<util:list>元素是由Spring的util命名空间所定义的。
(.?[])实现查询集合成员操作。(.^[]),(.$[]),查询第一个符合条件的集合成员和最后一个符合查询条件的成员。(.![])支持实现集合投影操作。
17、Spring提供两种方式来简化XML配置Bean:
自动装配:让Spring自动识别如何装配Bean的依赖关系,减少<constructor-arg><property>;
自动装配设置<bean>的autowire属性。
可以在根元素上增加一个default-autowire属性;默认情况下为no。
优先级:默认自动装配<自动装配<显示装配
Spring3支持三种注解:自带的@Autowired注解,JSR-330,JSR-250
@Autowired注解指定自动装配
@Qualifier注解指定按名字装配;
@Value注解指定基本属性和String类型
@Scope注解指定作用域;
@PostConstruct和@PreDestroy注解指定初始化方法与销毁方法
自动检测:让Spring自动识别哪些类需要被装配成Bean,减少<bean>;
<context:component-scan base-package>扫描包
@Component
@Controller
18、AOP(Aspect Oriented Programming)面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。
- AOP是OOP的延续和有益补充,也是Spring框架中的一个重要内容,是函数式编程的一种衍生泛型;
- AOP可以业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率;
- 在Spring中提供了AOP的丰富支持,允许通过分离应用的业务逻辑与系统级服务和事务管理进行内聚性的开发。
19、AOP和OOP的区别
- 设计思想不同;
- OOP针对业务处理过程的实体及属性和行为进行抽象封装,以获取更加清晰高效的逻辑单元划分;
- AOP针对业务处理过程中的切面进行提取,面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果;
- AOP绝对不会代替OOP,而是与OOP整合起来,以此之长,补彼之短。
20、横切关注点:在软件开发中,分布于应用中多处的功能被称为横切关注点。
AOP的目标正是将这些横切关注点与业务逻辑隔离开来。
AOP的主要功能如下:日志记录,性能统计,安全控制,事务处理,异常处理等。
21、Spring通过横向抽取机制为这类无法通过纵向继承体系(OOP的方式)进行抽象的重复性代码提供了解决方案。AOP就是将各个业务逻辑代码中相同的代码,通过横向切割的方式抽取到一个独立的模块中,让业务逻辑代码更加清晰。
22、连接点:程序执行的某个特定位置。一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码的特定点就成为连接点。注意:Spring仅支持方法的连接点,即方法调用前、方法调用后、方法抛出异常时这些程序执行点织入增强;
切点:每个类一般都拥有多个连接点,AOP需要定位到特定的连接点,而定位连接点的方式成为切点。注意:Spring中切点通过pointcut接口定义,它使用类和方法作为连接点的查询条件,SpringAOP的规则解析引擎负责解析切点所设定的查询条件,找到对应的连接点。
增强:增强就是织入到目标类连接点上的一段程序代码。在Spring中,增强除了用于描述一段程序代码外,还拥有另一个和连接点相关的信息-执行点的方位。结合执行点的方位信息和切点信息,AOP就可以找到特点的连接点。
BeforeAdvice:方法调用前 AfterReturnAdvice:方法调用后返回位置,Throws:抛出异常位置。
目标对象:它是增强逻辑的织入目标类,通过AOP,业务逻辑类只需要实现非横切逻辑的代码,而性能监视、事务管理等横切逻辑则可以使用AOP动态织入到特定的连接点上。
引介:是一种特殊的增强,它为类添加一些属性和方法,即使一个业务类原本没有实现某个接口,也可以通过AOP引介功能,动态的为业务类添加接口的实现逻辑,让业务类成为这个接口的实现类;
织入:将增强添加到目标类具体连接点上的过程,有三种方式:编译器织入;类装载期织入、动态代理织入。
代理:一个类被AOP织入增强后,就产生出了一个结果类,它是融合了原类和增强逻辑的代理类,根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类,所以可以采用调用原类相同的方式调用代理类。
切面:切面由切点和增强或引介组成。它既包括了横切逻辑的定义,也包括了连接点的定义。注意:SpringAOP负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中。
23、SpringAOP:使用纯Java实现,它不需要专门的编译过程,也不需要特殊的类装载器,它在运行期通过代理的方式向目标类织入增强代码。SpringAOP使用了两种代理机制:JDK动态代理和CGLib动态代理,它们是SpringAOP底层技术。
24、Spring增强类型
- 前置增强:BeforeAdvice,表示在目标方法执行前实施增强;
- 后置增强:AfterReturningAdvice,表示在目标方法执行后实施增强;
- 环绕增强:MethodInterceptor,表示在目标方法执行前后实施增强;
- 异常抛出增强:ThrowsAdvice,表示在目标方法抛出异常后实施增强;
- 引介增强:IntroductionInterceptor,表示在目标类中添加一些新的方法和属性。
25、ProxyFactory
Spring提供ProxyFactory代理工厂用于将增强织入到目标类中,ProxyFactory本质是对底层JDK动态代理和CGLib动态代理技术的封装。
26、XML配置
proxyInterfaces:代理所要实现的接口;
target-ref:指定代理的目标类;
InterceptorNames:需要织入目标对象的Bean名称列表
optimize:当设置为true时,强制使用Cglib动态代理技术。(注意:对singleton的代理,建议使用CGLib代理方式;其它类型的代理建议使用JDK代理方式)
27、切面
Spring支持两种方法匹配器:
静态方法匹配器:它仅对方法名签名进行匹配,且仅会判别一次;
动态方法匹配器:它支持在运行期检查方法入参的值,每次方法调用都必须判断,动态匹配对性能的影响很大,不常使用。
Spring提供三种切面类型:Advisor一般切面,仅包含一个Advice类;PointcutAdvisor具有切点的切面,包含Advice和Pointcut两个类;IntroductionAdvisor引介切面,对应引介增强的特殊切面。
28、Spring提供六种类型切点:静态方法切点、动态方法切点、注解切点、表达式切点、流程切点、复合切点。
29、静态普通方法名匹配切面:
StaticMethodMatcherPointcutAdvisor代表一个静态方法匹配切面,它通过StaticMethodMatcherPointcut定义切点,通过类过滤和方法名匹配定义切点,开发者需要继承该类切面,并提供匹配类过滤和方法匹配的规则。
30、静态正则表达式匹配切面
在RegexpMethodMatcherPointcutAdvisor中可以通过在配置中用正则表达式进行匹配,而无需写专门的切面实现类。
31、动态切点检查会对性能造成很大影响,所以在动态切点类定义静态切点检查的方法可以防止不必要的动态检查操作,可以极大地提高运行效率。
32、@Aspect注解,声明切面,配置在切面类上;@Before、@After、@AfterThrowing注解,声明前置增强,配置在方法上;@Around注解环绕增强,必须有一个ProceedingJoinPoint类型参数;@Pointcut(value=””)注解可以定义切点,可以在其他切面注解里引用该pointcut。
execution(返回类型 类全面.方法名(形参列表))
*代表任意字符,匹配上下文中的一个元素;
..代表任意字符,可以代表多个元素,但是表示类的时候不能单独使用,必须和*配合,在代表形参的时候可以单独使用;
+代表按类型匹配指定类的所有类(包括子类),只能跟在类名的后面。
Restful
REST(Representational State Transfer):
- 表述性状态转移,分布式超媒体软件的一种架构风格;
- 一套简单的设计原则、一种架构风格(或模式),不是一种具体的标准或架构;
- 基于使用HTTP、URI等现有的广泛流行的协议和标准,并由几个核心抽象概念支撑;
- 对Web的本质回归:一种真实描述Web的方式;
- 提供区分良好实践和糟糕实践的途径:判断特定实践是否与Web架构一致。
资源:资源可以是任何有表示的东西,并非所有的资源都是通过网络能够获取的;任何事物,只要有引用的必要,就是一个资源,它可以是一个实物,也可以是一个抽象的概念;通常一个资源是某个可以存放在计算机上并体现为比特流的事物,在Web中,可以这样认为——资源是URI标示的东西。
表示:Web上获取的不是资源,而是资源的表示,对于给定的资源,可以有很多不同的表示。
状态:让客户端维护应用状态,服务器不应该维护状态。
REST约束和风格:
- URI表示资源;
- CRUD操作;
- 状态表述转移;
- 无状态服务;
- HTTP状态码;
- Cache控制;
- Proxy;
REST核心是构架以资源为核心的模型。
Rest关键原则:
- 为所有资源定义ID;无论Web中的资源代表单一数据项、数据项集合、虚拟抑或实际的对象还是计算结果等,都可以使用URI标识。
- 将所有资源链接在一起;任何困难的情况下,使用链接指引可以被标识的资源。
- 使用标准方法;为使客户端程序能与Web中的资源相互协作,资源应该正确地实现HTTP协议中的四种方法映射为CRUD操作;
- 资源多重表示;尽可能针对不同的需求提供资源多重表示;
- 无状态通信。要做到无状态通信往往需要一些重新设计---不能简单的将一些Session状态绑缚在URI上。
RESTful:符合REST约束风格和原则的应用程序或设计就是RESTful。
Spring 支持RESTful风格:
@RequestMapping和PathVariable注解,支持资源标识和URL映射;
ContentNegotiatingViewResolver支持为不同MIME/内容类型使用不同的表示方式;
使用相似的编程模型无缝的整合到原始的MVC层。
注意:form标签不支持提交DELETE和PUT请求,解决方案如下:
(1):利用SpringMVC生成一个hidden的_method=put,并于web.xml中的HiddenHttpMethodFilter配合使用,在服务器端将post请求改为put请求;
(2):可以利用AJAX在客户端发出PUT、DELETE动作的请求。
目前互联网公司越来越流行提供RESTful形式的API供第三方调用。
Token(令牌)机制:就是用来解决无状态和安全性之间的矛盾。其实现原理如下:
- 用户发送用户名和密码,请求验证通过;
- 服务器判断用户名和密码是否正确;
- 服务器验证通过,返回Token及过期时间;
- 所有请求携带返回的Token在过期时间内即可通过Token验证并正常使用RESTfulAPI。
通过SpringMVC封装RESTfulAPI包括如下操作:Token认证机制、封装资源的CRUD操作、异常处理。
/////spring 转换请求方法过滤器配置
<filter>
<filter-name>HiddenHttpMethodFilter<
<filter-class>or.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter
<servlet-name>springMVC