spring概述
spring是什么
Spring是一个开放源代码的设计层面框架,他解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用。Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建。简单来说,Spring是一个分层的JavaSE/EE full-stack(一站式) 轻量级开源框架。
spring体系结构
程序的耦合和解耦
耦合:程序之间的依赖
包括:
- 类之间的依赖
- 方法之间的依赖
解耦:降低程序之间的依赖关系
实际开发中应该做到:编译时不依赖,运行时才依赖
解耦思路:
- 使用反射来创建对象,而避免使用new关键字
- 通过读取配置文件来获取要创建的对象全限定类名
知识补充
反射
在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性 。
简言之就是程序自己认识自己。
得到Class对象的三种方法:
- 类名.class
Class<?> cls = String.class;
- 对象.getClass
String str = "abc"; Class<?> cls = str.getClass();
- Class.forName(类的全名)
Class<?> cls = Class.forName("java.lang.String");
面向对象——三层架构
三层架构:即表现层、业务层、持久层
- 持久层:采用DAO模式,建立实体类和数据库表映射(ORM映射)。也就是哪个类对应哪个表,哪个属性对应哪个列。持久层的目的就是,完成对象数据和关系数据的转换。
- 业务层:采用事务脚本模式。将一个业务中所有的操作封装成一个方法,同时保证方法中所有的数据库更新操作,即保证同时成功或同时失败。避免部分成功部分失败引起的数据混乱操作。
- 表现层:采用MVC模式。
M称为模型,也就是实体类。用于数据的封装和数据的传输。
V为视图,也就是GUI组件,用于数据的展示。
C为控制,也就是事件,用于流程的控制。
设计原则:
业务层接口的设计原则:一个实体类一个接口,一次提交一个业务方法。业务方法的参数来自表现层。
持久层接口的设计原则:一个实体类一个接口,一次数据库操作一个持久方法。
工厂模式解耦
JavaBean:用java语言写的一个可重用组件。
JavaBean > 实体类
JavaBean是用来创建service和dao对象的。
- 需要一个配置文件来配置我们的service和dao,配置内容为全限定类名
- 通过读取配置文件中配置的内容,反射创建对象
配置Bean的两种文件
- properties
- xml
单例和多例:
所谓单例就是所有的请求都用一个对象来处理,比如我们常用的service和dao层的对象通常都是单例的,而多例则指每个请求用一个新的对象来处理,比如action。
单例模式和多例模式:
- 单例模式和多例模式属于对象模式。
- 单例模式的对象在整个系统中只有一份,多例模式可以有多个实例。
- 它们都不对外提供构造方法,即构造方法都为私有。
IOC概念和spring中的IOC
控制反转:控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
明确IoC的作用:削减计算机程序的耦合
传统模式:
工厂模式:
spring中基于XML的IOC环境搭建
spring工程配置方法(普通工程):
- 拷贝必备的 jar 包到工程的 lib 目录中
- 在类的根路径下创建一个任意名称的 xml 文件(不能是中文)
- 让 spring 管理资源,在配置文件中配置 service 和 dao
<!-- bean 标签:用于配置让 spring 创建对象,并且存入 ioc 容器之中
id 属性:对象的唯一标识。
class 属性:指定要创建对象的全限定类名-->
<!-- 配置 service -->
<bean id="accountService" class="com.itheima.service.impl.AccountServiceImpl">
</bean>
<!-- 配置 dao -->
<bean id="accountDao" class="com.itheima.dao.impl.AccountDaoImpl"></bean>
核心容器的两个接口:
- ApplicationContext(适用于单例对象):它在构建核心容器时,创建对象采取的策略是立即加载的方式,即一读完配置文件马上就创建配置文件中配置的对象。
- BeanFactory(适用于多例模式):它在构建核心容器时,创建对象采取的策略是延迟加载的方式,即什么时候根据id获取了对象,什么时候才真正的创建对象。
创建bean的三种方法:
- 使用默认构造函数下创建。在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其他属性和标签时。如果类中没有默认的构造函数,则对象无法创建。
- 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)。
- 使用工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)。
bean的作用范围:
- scope属性
作用:用于指定bean的作用范围
取值:singleton(default) prototype(多例的) request(作用于web应用的请求范围) session(作用于web应用的会话范围) global-session(作用于集群环境的会话范围或全局会话范围,当不是集群环境时,它就是session)
bean对象的生命周期:
对象 | 出生 | 活着 | 死亡 |
---|---|---|---|
单例对象 | 容器创建时 | 只要容器存在就一直或者 | 容器销毁时死亡 |
多例对象 | 当我们使用对象时spring框架为我们创建 | 对象只要在使用过程中就一直活着 | 当对象长时间不用,且没有别的对象引用时,由Java的垃圾回收器回收 |
总结:单例对象的生命周期和容器的生命周期相同。
依赖注入(Dependency Injection)
依赖关系的管理: 交给spring来维护。在当前类需要用到其他类的对象由spring为我们提供,我们只需在配置文件中说明。
依赖注入: 依赖关系的维护。
能注入的数据有三类:
- 基本类型和String
- 其他bean类型(在配置文件中说明或是注解配置过的bean)
- 复杂类型/集合类型
注入方式有三种:
- 使用构造函数提供
标签:constructor-arg
优势:在获取bean对象时,注入数据是必须的操作,否则对象无法创建成功。属性 作用 type 指定要注入的数据的数据类型,该数据类型是构造函数中某个或某些参数的类型 index 指定要注入的数据的在构造函数中的索引 name 用于给构造函数中指定名称的参数赋值 value 用于提供基本类型和String类型的数据 ref 用于指定其他的bean类型数据,即在spring的IoC核心容器中出现过的bean对象
弊端:改变了bean对象的实例化方式,使我们在创建对象时,如果用不到这些数据,也必须提供。 - 使用set方法提供
标签:property
优势:创建对象时没有明确的限制,可以直接使用默认构造函数。属性 作用 name 用于指定注入的时所调用的set方法的名称 value 用于提供基本类型和String类型的数据 ref 用于指定其他的bean类型数据,即在spring的IoC核心容器中出现过的bean对象
弊端:如果有某个成员必须有值,则获取对象是有可能set方法没有执行。
用于给List结构集合注入的标签:list array set
用于个Map结构集合注入的标签:map props
即结构相同,标签可以互换。 - 使用注解提供
注意事项:
- 经常变化的数据并不适用于注入的方式