1.Spring是什么?
一个轻量级的 Java 开发框架,它是为了解决企业应用开发的复杂性而创建的。
核心是控制反转(IoC——Inversion of Control)和面向切面编程(AOP——Aspect Orient Programming)。
一个分层的 Java SE/EE full-stack(一站式)轻量级开源框架。
2.为什么开发要使用spring框架,它解决了什么问题?
降低代码间的耦合度。——解耦
3.两个问题
第一,业务耦合?
先分析一下主业务逻辑和系统级业务逻辑的区别。主业务系统逻辑,代码之间有着较强的逻辑练习,复用性很小。
系统级业务逻辑主要是为系统提供各种服务的,例如JDBC连接数据库,日志,安全,事务等复用性很强。
对于程序员来说,事不过三,三则重构,你复用性这么强,肯定将你抽离出来进行封装。这样才能符合我们面向对象编程的特性。
比如有一项订单业务,查询当日订单量,我们以JDBC连接数据库为例。
①注册驱动
②获取数据库连接对象
③写sql语句——这就是我们的主业务逻辑,它只有这一个功能,单纯的去查询当日订单量,有具体的专业业务场景。
④获取执行SQL对象的statement
⑤执行SQL语句
⑥处理结果
⑦释放资源
但是①②④⑤⑥⑦这些步骤在其它业务场景中也需要,复用性很强,每一个业务都需要进行数据库连接等操作。我们把它们统称为系统级业务逻辑。如果将系统级业务从主业务逻辑中抽离出来,进行复用,这样业务逻辑将变得简单纯净。同样的每个业务都需要进行日志,安全,事务等系统级的业务服务,这些业务如果依旧写在每一个业务逻辑当中,就会造成业务逻辑繁琐复杂。AOP 就是这些问题的解决方案, 它把这些系统级别的业务服务剥离出来形成一个“切面”,以期复用,然后将“切面”动态的“织入”到业务逻辑中,让业务逻辑能够享受到此“切面”的服务。
第二,类与类之间耦合
想想我们的三层架构,controller 层依赖于service 层 , service层依赖于dao层。controller层需要service层对象(这里的对象可以看做成一种资源),①先导入service层,②声明变量,创建service层对象。这样类与类之间是不是存在一种关联关系。
4.Spring是如何解耦的呢?IoC与AOP
Spring 核心:IoC 与 AOP |
IoC是一种思想 ,它使得主业务在相互调用过程中,不用再自己维护关系了,即不在是自己创建要使用的对象了,而是将创建对象的主动权交给Spring容器,将对象的控制权交给Spring容器,由 Spring 容器统一管理,来实现对象的装配和管理,自动“注入”。
IOC实现方式主要有两种,
依赖查找(Dependency Lookup,DL):容器提供回调接口和上下文环境给组件,程序代码则需要提供具体的查找方式。比较典型的是依赖于 JNDI 系统的查找。(了解,已经不再使用)
依赖注入(Dependency Injection,DI):指程序运行过程中,若需要调用另一个对象协助时,无须在代码中创建被调用者,而是依赖于外部容器,由外部容器创建后传递给程序。
AOP 是一种编程思想,是面向对象编程 OOP 的补充。它使得系统级服务得到了最大复用,且不用再由程序员手工将系统级服务“混杂”到主业务逻辑中了,而是由 Spring 容器统一完成“织入”。
5.扩展:Spring容器
我们说容器为各个类创造所需要的资源,它通过配置文件的方式来定义对象,负责管理对象的生命周期,用来维护各个对象之间的依赖关系。
6.spring体系结构
Spring 由 20 多个模块组成,它们可以分为数据访问/集成(Data Access/Integration)、Web、面向切面编程(AOP, Aspects)、应用服务器设备管理(Instrumentation)、消息发送(Messaging)、核心容器(Core Container)和测试(Test)
7.创建一个Spring应用程序
目录结构如下
pom.xml文件,添加org.springframework:spring-context
依赖
依赖关系如下:所有的模块都依赖commons-logging
service层写一个say()方法
在 src/main/resources
下创建 spring-context.xml
配置文件,对象的创建工作交给 Spring 容器管理(IoC)
<bean />
:用于定义一个实例对象。一个实例对应一个 bean 元素。id
:该属性是 Bean 实例的唯一标识,程序通过 id 属性访问 Bean,Bean 与 Bean 间的依赖关系也是通过 id 属性关联的。class
:指定该 Bean 所属的类,注意这里只能是类,不能是接口。
编写一个MyTest类
运行结果