一、Spring框架基础知识
Spring的优势
1.方便解耦,简化开发:通过spring的ioc容器,将对象间的依赖关系交由Spring进⾏控制,避免硬编码所造成的
过度程序耦合,⽤户也不必再为单例模式类、属性⽂件解析等这些很底层的需求编写代码,可以更专注于上层的应⽤。
2. AOP编程的⽀持: 通过Spring的AOP功能,⽅便进⾏⾯向切⾯的编程,许多不容易⽤传统OOP实现的功能可以通过
AOP轻松应付。
3.声明式事务的支持:@Transactional 可以将我们从单调烦闷的事务管理代码中解脱出来,通过声明式⽅式灵活的进⾏事务的管理,提⾼开发效率和质量。
4.方便程序的测试
5.方便集成各种框架
6.降低Javaee api的使用难度
Spring的核心结构
数据处理模块、web模块、aop模块、core container模块、test模块
1. Spring核⼼容器(Core Container) 容器是Spring框架最核⼼的部分,它管理着Spring应⽤中
bean的创建、配置和管理。在该模块中,包括了Spring bean⼯⼚,它为Spring提供了DI的功能。
基于bean⼯⼚,我们还会发现有多种Spring应⽤上下⽂的实现。所有的Spring模块都构建于核⼼容器之上。
2. ⾯向切⾯编程(AOP)/Aspects Spring对⾯向切⾯编程提供了丰富的⽀持。这个模块是Spring应⽤系统中开发切⾯的基础,与DI⼀样,AOP可以帮助应⽤对象解耦。
3. 数据访问与集成(Data Access/Integration)
Spring的JDBC和DAO模块封装了⼤量样板代码,这样可以使得数据库代码变得简洁,也可以更专注于我们的业务,还可以避免数据库资源释放失败⽽引起的问题。 另外,Spring AOP为数据访问提供了事务管理服务,同时Spring还对ORM进⾏了集成,如Hibernate、MyBatis等。该模块由JDBC、Transactions、ORM、OXM 和 JMS 等模块组成。
4. Web 该模块提供了SpringMVC框架给Web应⽤,还提供了多种构建和其它应⽤交互的远程调⽤⽅案。 SpringMVC框架在Web层提升了应⽤的松耦合⽔平。
5. Test 为了使得开发者能够很⽅便的进⾏测试,Spring提供了测试模块以致⼒于Spring应⽤的测试。 通过该模块,Spring为使⽤Servlet、JNDI等编写单元测试提供了⼀系列的mock对象实现。
什么是IOC
控制反转/反转控制:控制指的是对象的创建、管理、实例化权利,反转指的是控制权交给了外部容器Spring框架。Ioc容器
具体实现:我们不⽤⾃⼰去new对象了,⽽是由IoC容器(Spring框架)去帮助我们实例化对象并且管理它,我们需要使⽤哪个对象,去问IoC容器要即可,而传统开发需要通过new对象来获取,依赖性强,通过IOC解决了对象之前的耦合问题。
IOC和DI的区别
DI其实就是依赖注入,和IOC描述的都是对象实例化和依赖关系维护这件事情,但是角度不同,IOC站在对象的角度,对象实例化及其管理的权利交给了(反转)容器,ID是站在容器的角度,容器会把对象依赖的其他对象注入,比如A对象在实例化过程中声明了一个B类型的属性,就要容器把B对象注入A。
什么是AOP
Aop是oop的延续,传统oop三大特性封装、继承、多态,成一种垂直继承体系,存在顶级分类代码重复无法优化问题,无法解决横向切面逻辑代码问题,所以就产生了aop,通过横向抽取机制,将横切逻辑代码和业务逻辑代码分析。在不改变原有业务逻辑情况下,增强横切逻辑代码,根本上解耦合,避免横切逻辑代码重复
为什么叫横向界面编程
「切」:指的是横切逻辑,原有业务逻辑代码我们不能动,只能操作横切逻辑代码,所以⾯向横切逻辑
「⾯」:横切逻辑代码往往要影响的是很多个⽅法,每⼀个⽅法都如同⼀个点,多个点构成⾯,有⼀个⾯的概念在⾥⾯
二、IOC容器设计实现及Spring源码分析
Spring框架的IOC实现三种方式
1. 纯xml方式
2. Xml加注解方式
上面两种方式加载相同:JavaEE应用通过new ClassPathXmlApplicationContext(“beas.xml”)或者new FileSystemXmlApplicationContext(“c:beans.xml”)加载;JavaWeb应用通过ContextLoaderListener(监听器去加载xml)
3. 纯注解方式
加载方式:JavaEE应用通过new AnnotationConfigApplicationContext(SpringConfig.class); JavaWeb应用通过ContextLoaderListener(监听器去加载注解配置类)
BeanFactory与ApplicationCentext区别
BeanFactory是Spring框架IOC容器顶层接口,定义了基础功能和规范,而ApplicationContect是他的子接口,不仅具备了他的所有功能,并且还对他进行扩展,支持了更多的功能,实现面向接口开发原则。
Spring IoC纯XML方式实现
Xml文件头
理解:通过引入Spring IoC容器功能,实现不需要再创建一个专门的BeanFactory来解析xml文件并返回,直接通过WebApplicationContextUtils.getWebApplicationContext就能获取到Spring工具类,再通过getBean方法获取到对应解析的全限定名转化成需要的类对象
Bean的创建方式及属性标签
实例化Bean的三种方式
1. 使用无参构造 推荐
<bean id="connectionUtils" class="com.lagou.edu.utils.ConnectionUtils"></bean>
2. 使用静态方法创建 需要自己去new
<bean id="connectionUtils" class="com.lagou.edu.factory.CreateBeanFactory" factory-method="getInstanceStatic"/>
3. 使用实例化方法创建 需要自己去new
<bean id="createBeanFactory" class="com.lagou.edu.factory.CreateBeanFactory"></bean>
<bean id="connectionUtils" factory-bean="createBeanFactory" factory-method="getInstance"/>
Scope:定义bean的作用范围
1. singleton:单例,IOC容器中只有一个该类对象,默认为singleton,单例模式的bean对象⽣命周期与容器相同。
2. prototype:原型(多例),每次使用该类的对象(getBean),都返回给你一个新的对象,Spring只创建对象,不管理对象
id属性: ⽤于给bean提供⼀个唯⼀标识。在⼀个标签内部,标识必须唯⼀。
class属性:⽤于指定创建Bean对象的全限定类名。
name属性:⽤于给bean提供⼀个或多个名称。多个名称⽤空格分隔。
factory-bean属性:⽤于指定创建当前bean对象的⼯⼚bean的唯⼀标识。当指定了此属性之后,class属性失效。
factory-method属性:⽤于指定创建当前bean对象的⼯⼚⽅法,如配合factory-bean属性使⽤,则class属性失效。如配合class属性使⽤,则⽅法必须是static的。
scope属性:⽤于指定bean对象的作⽤范围。通常情况下就是singleton。当要⽤到多例模式时,可以配置为prototype。
init-method属性:⽤于指定bean对象的初始化⽅法,此⽅法会在bean对象装配后调⽤。必须是⼀个⽆参⽅法。
destory-method属性:⽤于指定bean对象的销毁⽅法,此⽅法会在bean对象销毁前执⾏。它只能为scope是singleton时起作⽤。
Spring DI依赖注入配置
依赖注入分类:构造函数注入和set方法注入
注入类型:基本类型和String、其他Bean类型、复杂类型(map,list等等)
构造函数注入:constructor-arg标签
依靠构造函数对类成员进行赋值,而且构造函数参数要与配置参数个数相同、类型相同
name:⽤于给构造函数中指定名称的参数赋值。
index:⽤于给构造函数中指定索引位置的参数赋值。
value:⽤于指定基本类型或者String类型的数据。
ref:⽤于指定其他Bean类型的数据。写的是其他bean的唯⼀标识。