Spring框架入门详解教程

  • spring概述
  • spring结构
  • spring IOC
  • spring DI

spring概述

Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多层JavaEE系统的框架,它的主要目地是简化企业开发。

Spring以一种非侵入式的方式来管理你的代码, Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring。

Spring 它最初是由 Rod Johnson 编写的,并且于 2003 年 6 月首次在 Apache 2.0 许可下发布。

spring的特点

轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。而是容器在对象初始化时不等对象请求就主动将依赖传递给它。

面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。

容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的

框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等)。

spring结构

spring框架中的模块介绍
1,Data Access/Integration(数据访问/集成)

数据访问/集成层包括 JDBC、ORM、OXM、JMS 和 Transactions 模块。
JDBC 模块:提供了一个 JDBC 的抽象层,大幅度减少了在开发过程中对数据库操作的编码。
ORM 模块:对流行的对象关系映射 API,包括 JPA、JDO、Hibernate 和 iBatis 提供了的集成层。
OXM 模块:提供了一个支持对象/XML 映射的抽象层实现,如 JAXB、Castor、XMLBeans、JiBX 和 XStream。
JMS 模块:指 Java 消息服务,包含的功能为生产和消费的信息。
Transactions 事务模块:支持编程和声明式事务管理实现特殊接口类,并为所有的 POJO。

2, Web 模块

Spring 的 Web 层包括 Web、Servlet、Struts 和 Portlet 组件。
Web 模块:提供了基本的 Web 开发集成特性,例如多文件上传功能、使用的 Servlet 监听器的 IoC 容器初始化以及 Web 应用上下文。
Servlet模块:包括 Spring 模型—视图—控制器(MVC)实现 Web 应用程序。
Struts 模块:包含支持类内的 Spring 应用程序,集成了经典的 Struts Web 层。
Portlet 模块:提供了在 Portlet 环境中使用 MV C实现,类似 Web-Servlet 模块的功能。

3,Core Container(核心容器)

Spring 的核心容器是其他模块建立的基础,由 Beans 模块、Core 核心模块、Context 上下文模块和 Expression Language 表达式语言模块组成。
Beans 模块:提供了 BeanFactory,是工厂模式的经典实现,Spring 将管理对象称为 Bean。
Core 核心模块:提供了 Spring 框架的基本组成部分,包括 IoC 和 DI 功能。
Context 上下文模块:建立在核心和 Beans 模块的基础之上,它是访问定义和配置任何对象的媒介。ApplicationContext 接口是上下文模块 的焦点。
Expression Language 模块:是运行时查询和操作对象图的强大的表达式语言。

4,其他模块

Spring的其他模块还有 AOP、Aspects、Instrumentation 以及 Test 模块。
AOP 模块:提供了面向切面编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以降低耦合性。
Aspects 模块:提供与 AspectJ 的集成,是一个功能强大且成熟的面向切面编程(AOP)框架。
Instrumentation 模块:提供了类工具的支持和类加载器的实现,可以在特定的应用服务器中使用。
Test 模块:支持 Spring 组件,使用 JUnit 或 TestNG 框架的测试。

spring IOC

IOC: Inverse of Control(控制反转)
IOC 是指在程序开发中,实例的创建不再由调用者管理,而是由 Spring 容器创建。Spring 容器会负责控制程序之间的关系,而不是由程序代码直接控制,因此,控制权由程序代码转移到了 Spring 容器中,控制权发生了反转,这就是 Spring 的 IoC 思想。

Spring IOC 容器
Spring 容器是 Spring 框架的核心。容器将创建对象,把它们连接在一起,配置它们,并管理他们的整个生命周期从创建到销毁。这些对象被称为 Spring Beans。
Spring 提供了两种 IoC 容器,分别为 BeanFactory 和 ApplicationContext

Spring IOC 容器: BeanFactory
BeanFactory 是基础类型的 IoC 容器,它由 org.springframework.beans.facytory.BeanFactory 接口定义。
BeanFactory 接口有多个实现类,最常见的是 org.springframework.beans.factory.xml.XmlBeanFactory,它是根据 XML 配置文件中的定义装配 Bean 的。创建 BeanFactory 实例时,需要提供 Spring 所管理容器的详细配置信息,这些信息通常采用 XML 文件形式管理。
其加载配置信息的代码具体如下所示:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(“D://applicationContext.xml”));
或:
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource(“Beans.xml”));

Spring IoC 容器: ApplicationContext
ApplicationContext 是 BeanFactory 的子接口,也被称为应用上下文。该接口的全路径为 org.springframework.context.ApplicationContext。
ApplicationContext 接口有两个常用的实现类,具体如下:
ClassPathXmlApplicationContext:从类路径 ClassPath 中寻找指定的 XML 配置文件
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(String configLocation);

FileSystemXmlApplicationContext:从指定的文件路径中寻找指定的 XML 配置文件
ApplicationContext applicationContext = new FileSystemXmlApplicationContext(String configLocation);

Spring IoC 容器: BeanFactory 和 ApplicationContext的区别
BeanFactory 和 ApplicationContext 都是通过 XML 配置文件加载 Bean 的
二者的主要区别在于,如果 Bean 的某一个属性没有注入,则使用 BeanFacotry 加载后,在第一次调用 getBean() 方法时会抛出异常,而 ApplicationContext 则在初始化时自检,这样有利于检查所依赖的属性是否注入。
因此,在实际开发中,通常都选择使用 ApplicationContext,而只有在系统资源较少时,才考虑使用 BeanFactory

Spring IoC 容器:实例
1,新建Mavan java项目,在项目中新建HelloWorld类

public class HelloWorld {private String message;public void setMessage(String message){this.message  = message;}public void getMessage(){System.out.println("Your Message : " + message);}
}

2,在pom.xml文件中加入spring依赖包

<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.6.RELEASE</version>
</dependency>

3,在src/main下面新建一个resources文件夹,在文件夹中新建一个spring配置文件applicationContext.xml,内容如下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="helloWorld" class="com.dcs.HelloWorld"><property name="message" value="Hello World!"/></bean>
</beans>

4,新建一个Java 测试类MainApp

/*** ===========================* Author:多测师_何sir* Time:2020-08-09 22:19* Wechat:18665861277* website:www.duoceshi.cn* ===========================**/
public class MainApp {public static void main(String[] args) {BeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));HelloWorld obj = (HelloWorld) factory.getBean("helloWorld");obj.getMessage();ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");HelloWorld obj = (HelloWorld) applicationContext.getBean("helloWorld");obj.getMessage();}
}

Spring XML配置文件applicationContext.xml解析

XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation、dtd文件的具体含义

xmlns是XML Namespace的缩写,可译为“XML命名空间”
xmlns表示默认的Namespace。
xmlns:namespace-prefix=“namespaceURI”。其中namespace-prefix为自定义前缀,只要在这个XML文档中保证前缀不重复即可;namespaceURI是这个前缀对应的XML Namespace的定义,定义前缀的目的是为了解决在不同命名空间中有相同元素时,为了避免冲突,可以通过前缀来确定为哪一个命名空间中的元素。例如: xmlns:xsi xsi为前缀,xsi可以自定义,则使用元素时需要这样写xsi:dcs/,dcs为元素。

xsi:schemaLocation属性是Namespace为http://www.w3.org/2001/XMLSchema-instance里的schemaLocation属性
它定义了XML Namespace和对应的XSD(Xml Schema Definition)文档的位置的关系。它的值由一个或多个URI引用对组成,两个URI之间以空白符分隔(空格和换行均可)。第一个URI是定义的XML Namespace的值,第二个URI给出Schema文档的位置,Schema处理器将从这个位置读取Schema文档,该文档的targetNamespace必须与第一个URI相匹配。

xsd中可以带版本号,版本号建议省略。可用版本号可在依赖的spring包中查看

查看可用版本号

spring DI

DI(Dependency Injection)依赖注入
依赖注入和控制反转含义相同,它们是从两个角度描述的同一个概念。

当某个 Java 实例需要另一个 Java 实例时,传统的方法是由调用者创建被调用者的实例(例如,使用 new 关键字获得被调用者实例),而使用 Spring 框架后,被调用者的实例不再由调用者创建,而是由 Spring 容器创建,这称为控制反转。

Spring 容器在创建被调用者的实例时,会自动将调用者需要的对象实例注入给调用者,这样,调用者通过 Spring 容器获得被调用者实例,这称为依赖注入。

依赖注入主要有两种实现方式,分别是属性 setter 注入和构造方法注入。
1,属性 setter 注入
指 IoC 容器使用 setter 方法注入被依赖的实例。通过调用无参构造器或无参 static 工厂方法实例化 bean 后,调用该 bean 的 setter 方法,即可实现基于 setter 的 DI。
2,构造方法注入
指 IoC 容器使用构造方法注入被依赖的实例。基于构造器的 DI 通过调用带参数的构造方法实现,每个参数代表一个依赖。

属性 setter 注入实例
1,创建两个类:Teacher 和Student

public class Teacher {private Student student;// 老师点名输出学生姓名public void getStudent() {System.out.println(student.getName());}public void setStudent(Student student) {this.student = student;}
}
public class Student {private String name;public String getName() {return name;}public void setName(String name)  {this.name = name;}
}

2,创建spring配置文件:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id="teacher" class="com.dcs.Teacher"><property name="student" ref="student"/></bean><bean id="student" class="com.dcs.Student"><property name="name" value="张三"/></bean>
</beans>

bean中的class类的路径需要根据自己类的具体路径进行修改。

3,创建测试类TeacherTest

public class TeacherTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Teacher teacher = (Teacher)context.getBean("teacher");teacher.getStudent();}
}

构造方法注入实例:
1,创建两个类:Teacher 和Student

public class Teacher {private Student student;public Teacher(Student student) {this.student = student;}// 老师点名输出学生姓名public void getStudent() {System.out.println(student.getName());}
}
public class Student {private String name;public String getName() {return name;}public void setName(String name)  {this.name = name;}
}

2,创建spring配置文件:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.2.xsd"><bean id="teacher" class="com.dcs.Teacher"><constructor-arg ref="student"/></bean><bean id="student" class="com.dcs.Student"><property name="name" value="张三"/></bean>
</beans>

bean中的class类的路径需要根据自己类的具体路径进行修改。

3,创建测试类TeacherTest

public class TeacherTest {public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");Teacher teacher = (Teacher)context.getBean("teacher");teacher.getStudent();}
}

Java Spring框架入门详解教程【多测师_何sir】相关推荐

  1. java定时任务框架elasticjob详解

    这篇文章主要介绍了java定时任务框架elasticjob详解,Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架.该项目基于成熟的开源产品Quartz和Zo ...

  2. Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

    1.本地方法栈和程序计数器 ==>偏底层一般不会接触到 2.方法区 ==>对应为永久代 3.虚拟机栈(stack) ==>对应为栈 4.堆(heap) ==>对应里面有新生代+ ...

  3. Spring 快速入门详解

    Spring 入门详解 简介 Spring就是指Spring framework是分层的 Java SE/EE 一站式轻量级开源框架,Spring 框架是全家桶(spring mvc.spring b ...

  4. Java Spring全家桶详解——Spring简介

    今天新开一个专栏,专门讲解Spring全家桶的知识点,我会用通俗易懂的话讲解晦涩难懂的原理,并搭配代码演示,让大家快速入门 废话不多说,今天我们先学习Spring全家桶中的第一个框架:Spring 如 ...

  5. spring框架--全面详解(学习笔记)

    目录 1.Spring是什么 2.Spring 框架特点 3.Spring体系结构 4.Spring开发环境搭建 5.spring中IOC和DI 6.Spring中bean的生命周期 7.Spring ...

  6. Java安全框架---JWT详解

    JWT详解 一. JWT介绍 1. JWT官网解释 2. JWT作用 3. 传统的Session认证 1. 认证方式 2. 认证流程 3. 暴露问题 4. JWT认证 1. 认证流程 2. JWT优点 ...

  7. java中ioc和aop是什么?【杭州多测师】【杭州多测师_王sir】

    一.什么是IOC? 1.IoC (Inversion of control )就是控制反转/反转控制.它是一种思想不是一个技术实现.主要就是用来解决创建和管理对象的 2.就是不需要通过new 关键字来 ...

  8. 第6章 MyBatis框架入门详解(1)

    数据持久化 在这章开始之前首先简单介绍一下什么是数据持久化.其实"持久化"是相对"临时"来说的,在计算机中存放数据的地方主要有两个,一个是内存,一个是硬盘,在内 ...

  9. python+requests接口自动化测试框架实例详解教程

    前段时间由于公司测试方向的转型,由原来的web页面功能测试转变成接口测试,之前大多都是手工进行,利用postman和jmeter进行的接口测试,后来,组内有人讲原先web自动化的测试框架移驾成接口的自 ...

最新文章

  1. ORA-12519, ORA-00020异常产生原因及解决方案
  2. MDK出现红叉,程序编译正常没有错误
  3. F(n)完全覆盖中的计数问题
  4. Python: tkinter实例改名小工具
  5. Android分享中, 过滤指定的应用,已经过滤蓝牙, 并且对不同的分享方式发送不同的内容?...
  6. 与protected成员有关的单元测试方式
  7. 01背包初始化的细节问题与循环下限的改进
  8. 数据结构--直接插入排序
  9. [转]Unity3D新手引导开发手记
  10. 职称计算机xp系统试题,2020年职称计算机WindowsXP测试题及答案.doc
  11. 亚马逊机器学习工程师面试怎么过?
  12. linux中 查看系统属性 与 可执行文件属性 的方法
  13. 【eoeAndroid社区索引】Android二维码知识汇总
  14. Linux常用命令讲解(pdf在我的资源可以下载,有图)
  15. 计算机MAR代表什么,MAR是什么意思?
  16. 基于asp.net车辆管理调度系统的设计与实现
  17. 公众号资源方法,数据集,绘图学习持续更新记录~~~
  18. 常用数字与字母的正则表达式(转载)
  19. 数博会金蝶揭秘智能零售:名企转型底气
  20. windows驱动快速入门

热门文章

  1. matlab射频传输距离计算,Lora参数计算和RF射频传输距离计算公式和工具
  2. 大灯照出来的光有阴影_揭秘为什么车灯改装换了氙气灯泡或LED大灯会有黑影
  3. 是计算机病毒在危害你
  4. 民生银行牛新庄: 业务数据化数据业务化,以数据驱动业务发展
  5. 龙芯发布首款自主指令系统LoongArch服务器芯片解决方案;宜鼎国际亮相2021年中国国际信息通信展览会 | 全球TMT...
  6. 转转二手助力交易市场加速流转
  7. win10固态硬盘还需要分区吗? 不需要
  8. 离散中偏序集、乘积群、关系的性质和集合的相关证明
  9. c语言七巧板编程实验报告,智力七巧板社团活动记录表
  10. 苹果cms V10采集插件安装教程