整理这个东西是因为:
第一章:Spring入门
1、Spring简介
一个轻量级Java的开发框架
为了解决企业级开发业务逻辑层和其他各层的耦合问题
负责基础架构,开发者可以专注于应用程序的开发
2、Spring的体系结构
1. 核心容器
- Spring-core模块:框架的基本组成部分,包括控制反转(IOC)和依赖注入(DI)
- Spring-bean模块:提供BeanFactory,负责管理Bean对象
- Spring-context模块: 提供一个框架式的对象访问方式
- Spring-context-support模块:支持整合第三方库到到Spring应用程序的上下文(缓存、邮件服务、任务计划…)
- Spring-excpression模块:支持Spring Excpression Language (SpEL)
2. AOP和Instrumentation
- Spring-aop模块:提供了符合AOP要求的面向切面的编程实现
- Spring-aspects模块:提供了对AspectJ的支持
- Spring-instrument模块:提供了用于某些应用程序服务器的类工具支持和类加载器实现
3. 消息
- Spring-messaging模块:集成messaging api和消息协议提供支持
4. 数据访问
- Spring-jdbc模块:提供了一个Jdbc抽象层
- Spring-orm模块:为流行的对象关系映射提供集成层,包括JPA和Hibernate
- Spring-oxm模块:提供了一个支持对象/XML文件映射的抽象层实现
- Spring-jms模块:指Java消息传递服务,包含用于生产和使用消息的功能
- Spring-tx模块: 支持用于编程式和声明式事务管理
5. Web及远程操作层
- Spring-web模块:提供了基本的Web开发集成功能
- Spring-webmvc模块:包含用于Web应用程序的SpringMVC和REST Web Service实现
- Spring-websocket模块:Spring4.0后新增的模块,它提供了WebSoket和SockJS的实现。
- Spring-portlet模块:spring自己实现的一个类似Spring MVC的框架
5. 测试
- Spring-test模块:进行单元测试和集成测试
3、Spring的开发环境的构建
第二章、Spring IOC
1、基本概念
IOC即控制反转(Inversion of Control)是Spring框架的核心,用来解决程序中的耦合问题
依赖注入(dependency injection)是IOC的另一种说法
当Spring框架出现后、对象的实例不再由调用者来创建,而是由Spring容器来创建
在Spring中实现控制反转的是IOC容器,其实现方法是依赖注入
2、IOC容器
Spring IOC容器的设计主要基于BeanFactory和ApplicationContext两个接口
1. BeanFactory接口
一个管理Bean的工厂,主要负责初始化各种Bean。BeanFactory有多个实现类
比较常用的是XmlBeanFactory,该类根据Xml配置文件中的定义来装配Bean
例如:
//初始化Spring容器,加载配置文件
BeanFactory beanfac = new XmlBeanFactory(new FileSystemResource("xml配置文件路径"));
//通过容器获取TestDao实例
TestDao tt = (TestDao)beanfac.getBean("test");
tt.sayHello();
2. AppplicationContext接口
AppplicationContext是BeanFactory的子接口,该接口除了包含BeanFactory的所有功能以为,还添加了国际化、资源访问、事件传播等内容的支持
创建AppplicationContext的实列通常有三种方法:
通过ClassPathXmlApplicartionContext创建:将从类路径目录中寻找指定的xml配置文件
通过FileSystemXmlApplicationContext创建:将从指定文件的绝对路径中寻找xml配置文件
通过Web服务器实例化ApplicationContext容器:在Web服务器实例化ApplicationContext容器时,通过web.xml文件寻找xml配置文件
3、依赖注入的类型
1. 能注入的数据
- 基本数据类型和String
- 其他Bean类型(在配置文件或注解中配置过的Bean)
- 复杂类型/集合类型(list set map)
2. 构造方法注入
使用的标签:constructor-arg
标签所在位置:bean 标签的内部
标签中的属性:
标签 | 含义 |
type | 用于指定要注入的数据类型,该类型也是构造函数中某个或某些参数的类型 |
index | 表示构造方法的第几个参数 |
name(常用) | 表示构造函数中指定名称的参数 |
value | 用于提供基本类型和String类型的数据 |
ref | 表示引用某个实例(在 Spring 容器中出现过的bean) |
3. 属性set方法注入(主流方法)
使用的标签:property
出现的位置:bean 标签的内部
标签的属性:
标签 | 含义 |
name | 表示属性的名称 |
value | 用于提供基本类型和String类型的数据 |
ref | 表示引用某个实例(在 Spring 容器中出现过的bean) |
第三章、Spring Bean
1. Bean的配置
- Spring框架支持XML和Properties两种格式的配置文件,实际开发中以XML格式的配置文件为主
- Spring框架中,XML配置文件的根元素是
<beans>
<bean>
元素的id是bean的唯一标识<bean>
元素的class是bean将要实例化的类名
2. Bean的实例化
bean实例化的三种方法:
- 构造方法实例化
- 静态工厂实例化
- 实例工厂实例化
3. Bean的作用域
作用域名称 | 含义 |
singletond | 单例的,Spring容器中只有一个Bean实例(默认) |
prototype | 多例的,每次请求,Spring容器都将创建一个新的bean实例 |
request | 一次HTTP请求,Spring容器将返回一个bean实例,不同的Http请求返回不同的Bean |
session | 在一个HTTPSession中,一个Bean对应一个实例 |
application | 为每个ServletContext对象创建一个实例,即同一个应用共享Bean实例 |
websocket | 为每个WebSocket对象创建一个Bean实例 |
4. Bean的生命周期
- 单例对象(singletond):Spring精确的知道Bean何时被创建,何时初始化完成,以及何时销毁
- 多例对象(prototype):Spring只负责创建,不跟踪其生命周期
- 在bean初始化时,如果要执行指定自定义的初始化方法,需要在xml文件中配置bean的init-method属性值
- 在bean销毁时,如果要执行指定自定义的销毁方法,需要在xml文件中配置bean的destroy-method属性值
- bean的生命周期大致可归纳为“实例化–>初始化(init)–>使用–>销毁(destory)”等阶段
5. Bean的装配方式
1. 基于Xml的装配方式
- 第二章第三节已述,点击跳转
2. 基于注解的装配方式(主流方式)
- @Component:该注解是一个泛化的概念,仅仅表示一个组件对象(Bean),可以作用在任何层次上
- @Reposittory: 该注解用于将数据访问层(DAO)的类标识文Bean ,即注解数据访问层Bean
- @Service:该注解用于标注业务逻辑层组件类(Service层)
- @Contrller:该注解用于标注一个控制器组件类(Spring MVC 的 Controller)
- @Autowired:该注解可以对类成员变量、方法及构造方法进行标注,完成自动装配工作,默认按Bean的类型进行装配,如果要按名称装配注入,需要和@Qualifier注解配合使用
- @Resource:该注解与@Autowired的功能相同,但是@Resource默认按照名称来装配注入
- @Qualifier: 该注解与@Autowired注解配合使用。当@Autowired注解需要按照名称来装配注入时,需要和该注解一起使用
第四章、Spring Aop
1. Spring AOP的基本概念
AOP概念(Aspect-Oriented Programming):即面向切面编程,与OOP(Object - Oriented Programming,面向对象编程)相辅相成,AOP的基本单元为Aspect(切面),AOP采取横向抽取机制将分散在各个方法中的重复代码提取出来,然后在编译或运行阶段将这些代码应用到需要执行的地方
Aop的术语
- 切面(Aspect):是指封装抽取功能的类
- 连接点(Joinpoint):连接点是指代码中一些具有边界性质的特定位置,或程序运行时的一些时间点
- 切入点(Pointcut):是指调用切面功能的连接点
- 通知(Advice)是切面添加到切入点的一段代码,即切入点要执行的程序代码
- 引入(Introduction):特殊的增强,可以为目标类添加自定义属性及方法
- 目标对象(Target):需要添加增强的目标类
- 代理(Proxy)是通知应用到目标对象之后被动态创建的对象
- 织入(Weaving)是将切面代码插入到目标对象上,从而生成代理对象的过程
2. 动态代理
- 特点:字节码随用随创建,随用随加载
- 作用:不修改源码的基础上对方法增强
- 方式:
- JDK动态代理
要求:被代理类最少实现的一个接口,如果没有则不能使用 - CGLIB动态代理
要求: 被代理类不能是最终类(Final)
3. 基于代理的AOP实现
1. 通知的类型
- 环绕通知:是在目标方法执行前和执行后实施增强,可以替换其他的增强,可应用与日志记录,事务处理等功能。
- 前置通知:在目标方法执行前实施增强,如果增强不抛出异常,那么连接点一定会被执行,应用于权限管理。
- 后置返回通知:在目标方法成功执行后(即没有抛出异常的情况)实施增强,用于关闭流,删除临时文件等功能,
- 后置最终通知:在目标方法执行后增强,即连接点在出现任何情况下都会执行的通知,一般用于释放资源,
- 异常通知: 是在方法抛出异常后的增强。
- 引入通知:一种特殊的增强,能够使目标类实现某个指定的接口,可以添加属性和方法,可应用于修改目标类。
Spring Aop的Bug:
在使用注解配置通知时,产生后置通知与最终通知顺序会发生颠倒
使用环绕通知的方式则通知顺序正常
4. 基于XML配置开发AspectJ
基于XML文件配置开发AspectJ通过Xml文件定义切面,切入点及通知,所有的定义都在aop:config元素及其子元素中。
- aop:config 是顶层配置元素标签,表明开始 AOP 的设置
- 使用 aop:aspect标签配置切面
- id属性:是给切面提供一个唯一标识
- ref属性:是指定通知类Bean的id
- 在aop:aspect标签的内部使用对应标签来配置通知的类型
- aop:before配置前置通知
- aop:after-returning配置返回后增强(后置返回通知)
- aop:around配置环绕通知
- aop:after-throwing配置异常通知
- aop:after配置后置(最终)通知
- method 属性:用于指定类中哪个方法是后置通知
- pointcut-ref 属性:指定关联的切入点
- 切入点表达式子的书写
- 关键字:execution ( 表达式 )
- 表达式
- 标准写法:访问修饰符 返回值类型 包名.类名.方法名(参数列表)
- 举例:public void com.xagu.service.impl.ITestServiceImpl.helloSSM (String)
- 全通配写法:
* * ..*.*(..)
- 访问修饰符可以省略
- 返回值可以使用通配符,表示任意返回值
- 包名可以使用通配符,表示任意包,但是有几级包写几个
*
- 包名可以使用
..
表示当前包和子包 - 类名都可以使用
*
来实现通配,表示包下任意类 - 方法名可以使用通配符
*
,表示类下任意方法 - 参数列表:
- 可以直接写数据类型:
- 基本类型直接写名称(如int,boolean)
- 引用类型写包名.类名的方式 (如
java.lang.String
)
- 可以使用通配符表示任意类型,但是必须有参数
- 可以使用 … 表示有无参数即可,有参数可以是任意类型
- 配置切入点表达式(aop:pointcut):
- id属性用于指定表达式的唯一标识,expression属性用于指定表达式内容
- 此标签写在aop:aspect标签内部只能当前切面使用,在其外部则所有切面可用
5. 基于注解开发AspectJ
基于注解开发AspectJ要比基于Xml的方式方便得多,实际开发中推荐使用注解得方式
注解名称 | 描述 |
@Aspect | 用来定义一个切面,注解在切面类上 |
@pointcut | 用于定义切入点表达式。在使用时还需要定义一个包含名字和任意参数的方法签名来表示切入点名称,这个方法签名就是一个返回值为void,且方法体为空的普通方法。 |
@Before | 用于定义前置通知。在使用时,通常需要指定一个value属性值,可以是已有的切入点,也可以直接定义切入点表达式 |
@AfterReturning | 用于定义后置通知。在使用时可以指定pointcut / value和returning属性,其中pointcut / value这两个属性的作用一样,都用于指定切入点表达式。returning属性值用于表示Advice方法中定义与此同名的形参,该形参可用于访问目标方法的返回值。 |
@Around | 用于定义环绕通知。在使用时需要指定一个value属性,该属性用于指定该通知被植入的切入点。 |
@After-Throwing | 用于定义异常通知来处理程序中未处理的异常。在使用时可指定pointcut / value和throwing属性。其中pointcut/value用于指定切入点表达式,而throwing属性值用于指定-一个形参名来表示Advice方法中可定义与此同名的形参,该形参可用于访问目标方法抛出的异常。 |
@After | 用于定义后置(最终)通知。使用时需要指定一个value属性,该属性用于指定该通知被植入的切入点。 |