一、Spring框架介绍
Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库。
spring的优势
(1)方便解耦,简化开发
通过 Spring 提供的 IoC 容器,可以将对象间的依赖关系交由 Spring 进行控制,避免硬编码所造成的过度程序耦合。
(2)AOP 编程的支持
通过 Spring 的 AOP 功能,方便进行面向切面的编程,许多不容易用传统 OOP 实现的功能可以通过 AOP 轻松应付。
(3)声明式事务的支持
(4)方便程序的测试
(5)方便集成各种优秀框架
spring的体系结构
二、IOC和DI
-
什么是程序的耦合
耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差( 降低耦合性,可以提高其独立性)。在软件工程中,耦合指的就是对象之间的依赖性。对象之间的耦合越高,维护成本越高。因此对象的设计应使类和构件之间的耦合最小。软件设计中通常用耦合度和内聚度作为衡量模块独立程度的标准。划分模块的一个准则就是高内聚低耦合。
内聚与耦合
内聚标志一个模块内各个元素彼此结合的紧密程度,它是信息隐蔽和局部化概念的自然扩展。内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系。耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。 程序讲究的是低耦合,高内聚。就是同一个模块内的各个元素之间要高度紧密,但是各个模块之间的相互依存度却要不那么紧密。
内聚和耦合是密切相关的,同其他模块存在高耦合的模块意味着低内聚,而高内聚的模块意味着该模块同其他模块之间是低耦合。在进行软件设计时,应力争做到高内聚,低耦合。
-
IOC控制反转
在我们的开发中,有些依赖关系是必须的,有些依赖关系可以通过优化代码来解除。
例:业务层调用持久层,此时业务层依赖持久层的接口和实现类,如果此时缺少持久层实现类,编译将无法通过。这种编译期依赖关系是我们应该杜绝的。
工厂模式解耦
工厂就是负责给我们从容器中获取指定对象的类。这时候我们获取对象的方式发生了改变。
在应用加载时,创建一个Map,用于存放三层对象。
原来:我们在获取对象时,都是采用 new 的方式。是主动的。
现在:我们获取对象时,同时跟工厂要,有工厂为我们查找或者创建对象。是被动的。
-
概念
控制反转把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
IOC的作用:削减计算机程序的耦合(解除我们代码中的依赖关系)。
-
使用步骤
(1)配置相应的依赖pom.xml
(2)spring配置文件bean.xml(名称可任意取)
在xml文件中导入相应的约束
bean标签
(3)使用ApplicationContext接口,获取spring容器,再根据bean的id获取对象
BeanFactory 和 ApplicationContext 的区别
-
Bean标签
作用: 用于配置对象让 spring 来创建的。默认情况下 它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。属性:id :给对象在容器中提供一个唯一标识。用于获取对象。class :指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。scope :指定对象的作用范围。* singleton : 默认值,单例的 .* prototype : 多例的 .* request :WEB 项目中 ,Spring 创建一个 Bean 的对象 , 将对象存入到 request 域中 .* session :WEB 项目中 ,Spring 创建一个 Bean 的对象 , 将对象存入到 session 域中 .* global session :WEB 项目中 , 应用在 Portlet 环境 . 如果没有 Portlet 环境那么globalSession 相当于 session.init-method :指定类中的初始化方法名称。destroy-method :指定类中销毁方法名称。
-
Bean的作用范围和生命周期
单例对象: scope="singleton"一个应用只有一个对象的实例。它的作用范围就是整个应用。生命周期:对象出生:当应用加载,创建容器时,对象就被创建了。对象活着:只要容器在,对象一直活着。对象死亡:当应用卸载,销毁容器时,对象就被销毁了 。多例对象: scope="prototype"每次访问对象时,都会重新创建对象实例。生命周期:对象出生:当使用对象时,创建新的对象实例。对象活着:只要对象在使用中,就一直活着。对象死亡:当对象长时间不用时,被 java 的垃圾回收器回收了。
-
spring的依赖注入
概念
依赖注入: Dependency Injection 。它是 spring 框架核心 ioc 的具体实现。我们的程序在编写时,通过控制反转,把对象的创建交给了 spring ,但是代码中不可能出现没有依赖的情况。 ioc 解耦只是降低他们的依赖关系,但不会消除。例如:我们的业务层仍会调用持久层的方法。那这种业务层和持久层的依赖关系,在使用 spring 之后,就让 spring 来维护了。简单的说,就是坐等框架把持久层对象传入业务层,而不用我们自己去获取。
注入方式
(1)构造函数注入
就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置的方式,让 spring 框架来为我们注入。
类中需要提供一个对应参数列表的构造函数。如:
涉及到的标签:constructor-arg
属性:index : 指定参数在构造函数参数列表的索引位置type : 指定参数在构造函数中的数据类型name : 指定参数在构造函数中的名称value : 它能赋的值是基本数据类型和 String 类型ref : 它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean例:![]()
(2)