上海做网站的,深圳龙华新区,网站建设开发原代码归属,淄博铺无忧网络科技有限公司#x1f33b;#x1f33b; 目录 一、前提介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 二、Spring相关概念2.1 初始Spring2.1.1 Spring家族2.1.2 了解 Spring 发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2… 目录 一、前提介绍1.1 为什么要学?1.2 学什么?1.3 怎么学? 二、Spring相关概念2.1 初始Spring2.1.1 Spring家族2.1.2 了解 Spring 发展史 2.2 Spring系统架构2.2.1 系统架构图2.2.2 课程学习路线 2.3 Spring核心概念2.3.1 目前项目中的问题2.3.2 IOC、IOC容器、Bean、DI2.3.3 核心概念小结 三、入门案例3.1 IOC入门案例3.1.1 入门案例思路分析3.1.2 入门案例代码实现 3.2 DI入门案例3.2.1 入门案例思路分析3.2.2 入门案例代码实现 一、前提介绍 对于一门新技术我们需要从为什么要学、学什么以及怎么学这三个方向入手来学习。那对于Spring 来说: 1.1 为什么要学? 从使用和占有率看 Spring在市场的占有率与使用率高Spring在企业的技术选型命中率高所以说,Spring技术是JavaEE开发必备技能企业开发技术选型命中率90% 本质来说没钱感兴趣可以打发时间 说明:对于未使用Spring的项目一般都是些比较老的项目大多都处于维护阶段。 从专业角度看 随着时代发展软件规模与功能都呈几何式增长开发难度也在不断递增该如何解决? Spring可以简化开发降低企业级开发的复杂性使开发变得更简单快捷 随着项目规模与功能的增长,遇到的问题就会增多为了解决问题会引入更多的框架这些框架如何协调工作? Spring可以框架整合高效整合其他技术提高企业级应用开发与运行效率 综上所述Spring是一款非常优秀而且功能强大的框架不仅要学而且还要学好 1.2 学什么? 从上面的介绍中我们可以看到Spring框架主要的优势是在简化开发和框架整合上至于如何实现就 是咱们要学习Spring框架的主要内容: 简化开发: Spring框架中提供了两个大的核心技术分别是: IOC AOP 事务处理 Spring的简化操作都是基于这两块内容,所以这也是Spring学习中最为重要的两个知识点。事务处理属于Spring中AOP的具体应用可以简化项目中的事务管理也是Spring技术中的一大亮点。 框架整合: Spring在框架整合这块已经做到了极致它可以整合市面上几乎所有主流框架比如: MyBatisMyBatis-plusStrutsStruts2Hibernate…… 这些框架中我们目前只学习了MyBatis所以在Spring框架的学习中主要是学习如何整合MyBatis。 综上所述对于Spring的学习主要学习四块内容:(1)IOC,(2)整合Mybatis(IOC的具体应用)(3)AOP,(4)声明式事务(AOP的具体应用) 1.3 怎么学? 学习Spring框架设计思想 对于Spring来说它能迅速占领全球市场不只是说它的某个功能比较强大更重要是在它的思想上。 学习基础操作思考操作与思想间的联系 掌握了Spring的设计思想然后就需要通过一些基础操作来思考操作与思想之间的关联关系 学习案例熟练应用操作的同时体会思想 会了基础操作后就需要通过大量案例来熟练掌握框架的具体应用加深对设计思想的理解。 介绍完为什么要学、学什么和怎么学Spring框架后大家需要重点掌握的是: Spring很优秀需要认真重点的学习Spring的学习主线是IOC、AOP、声明式事务和整合MyBais 接下来咱们就开始进入Spring框架的学习。 二、Spring相关概念
2.1 初始Spring 在这一节主要通过以下两个点来了解下Spring: 2.1.1 Spring家族 官网https://spring.io从官网我们可以大概了解到 Spring能做什么:用以开发web、微服务以及分布式系统等,光这三块就已经占了JavaEE开发的九成多。 Spring并不是单一的一个技术而是一个大家族可以从官网的Projects中查看其包含的所有技术。 Spring发展到今天已经形成了一种开发的生态圈,Spring提供了若干个项目,每个项目用于完成特定的功能。Spring已形成了完整的生态圈也就是说我们可以完全使用Spring技术完成整个项目的构建、设计与开发。 Spring有若干个项目可以根据需要自行选择把这些个项目组合起来起了一个名称叫全家桶如下图所示 说明: 图中的图标都代表什么含义可以进 https://spring.io/projects网站进行对比查看。这些技术并不是所有的都需要学习额外需要重点关注 Spring Framework、SpringBoot和 SpringCloud : Spring Framework:Spring框架是Spring中最早最核心的技术也是所有其他技术的基础。SpringBoot:Spring是来简化开发而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。SpringCloud:这个是用来做分布式之微服务架构的相关开发。 除了上面的这三个技术外还有很多其他的技术也比较流行如 SpringData,SpringSecurity等这些都可以被应用在我们的项目中。我们今天所学习的 Spring其实指的是Spring Framework。 2.1.2 了解 Spring 发展史 接下来我们介绍下Spring Framework这个技术是如何来的呢? Spring发展史 IBM(IT公司-国际商业机器公司)在1997年提出了EJB思想,早期的JAVAEE开发大都基于该思想。Rod Johnson(Java和J2EE开发领域的专家)在2002年出版的Expert One-on-One J2EE Design and Development ,书中有阐述在开发中使用EJB该如何做。Rod Johnson在2004年出版的Expert One-on-One J2EE Development without EJB ,书中提出了比EJB思想更高效的实现方案并且在同年将方案进行了具体的落地实现这个实现就是Spring1.0。随着时间推移版本不断更新维护目前最新的是Spring5 Spring1.0是纯配置文件开发 Spring2.0为了简化开发引入了注解开发此时是配置文件加注解的开发方式 Spring3.0已经可以进行纯注解开发使开发效率大幅提升我们的课程会以注解开发为主 Spring4.0根据JDK的版本升级对个别API进行了调整 Spring5.0已经全面支持JDK8现在Spring最新的是5系列所以建议大家把JDK安装成1.8版 本节介绍了Spring家族与Spring的发展史需要大家重点掌握的是: 今天所学的Spring其实是Spring家族中的Spring FrameworkSpring Framework是Spring家族中其他框架的底层基础学好Spring可以为其他Spring框架的学习打好基础 2.2 Spring系统架构 前面我们说spring指的是Spring Framework,那么它其中都包含哪些内容以及我们该如何学习这个框架? 针对这些问题我们将从系统架构图和课程学习路线来进行说明: 2.2.1 系统架构图 Spring Framework是Spring生态圈中最基础的项目是其他项目的根基。Spring Framework的发展也经历了很多版本的变更每个版本都有相应的调整 Spring Framework的5版本目前没有最新的架构图而最新的是4版本所以接下来主要研究的 是4的架构图 (1)核心层 Core Container:核心容器这个模块是Spring最核心的模块其他的都需要依赖该模块 (2)AOP层AOP:面向切面编程它依赖核心层容器目的是在不改变原有代码的前提下对其进行功能增强Aspects:AOP是思想,Aspects是对AOP思想的具体实现 (3)数据层Data Access:数据访问Spring全家桶中有对数据访问的具体实现技术Data Integration:数据集成Spring支持整合其他的数据层解决方案比如Mybatis Transactions:事务Spring中事务管理是Spring AOP的一个具体实现也是后期学习的重点内容 (4)Web层 这一层的内容将在SpringMVC框架具体学习 (5)Test层 Spring主要整合了Junit来完成单元测试和集成测试 2.2.2 课程学习路线 介绍完Spring的体系结构后从中我们可以得出对于Spring的学习主要包含四部分内容分别是: Spring的IOC/DISpring的AOPAOP的具体应用,事务管理IOC/DI的具体应用,整合Mybatis 对于这节的内容大家重点要记住的是Spring需要学习的四部分内容。接下来就从第一部分开始学 起 2.3 Spring核心概念 在Spring核心概念这部分内容中主要包含IOC/DI、IOC容器和Bean ,那么问题就来了这些都是什 么呢? 2.3.1 目前项目中的问题 要想解答这个问题就需要先分析下目前咱们代码在编写过程中遇到的问题 (1)业务层需要调用数据层的方法就需要在业务层new数据层的对象 (2)如果数据层的实现类发生变化那么业务层的代码也需要跟着改变发生变更后都需要进行编译打包和重部署 (3)所以现在代码在编写的过程中存在的问题是耦合度偏高 针对这个问题该如何解决呢? 我们就想如果能把框中的内容给去掉不就可以降低依赖了么但是又会引入新的问题去掉以后程序能运行么? 答案肯定是不行因为bookDao没有赋值为Null强行运行就会出空指针异常。所以现在的问题就是业务层不想new对象运行的时候又需要这个对象该咋办呢? 针对这个问题Spring就提出了一个解决方案: 使用对象时在程序中不要主动使用new产生对象转换为由外部提供对象 这种实现思就是Spring的一个核心概念。 2.3.2 IOC、IOC容器、Bean、DI
IOCInversion of Control控制反转
(1) 什么是控制反转呢 使用对象时由主动new产生对象转换为由外部提供对象此过程中对象创建控制权由程序转移到 外部此思想称为控制反转。 业务层要用数据层的类对象以前是自己new的现在自己不new了交给别人[外部]来创建对象别人[外部]就反转控制了数据层对象的创建权这种思想就是控制反转别人[外部]指定是什么呢?继续往下学 (2) Spring和IOC之间的关系是什么呢? Spring技术对IOC思想进行了实现Spring提供了一个容器称为IOC容器用来充当IOC思想中的外部IOC思想中的别人[外部]指的就是Spring的IOC容器 (3) IOC容器的作用以及内部存放的是什么? IOC容器负责对象的创建、初始化等一系列工作其中包含了数据层和业务层的类对象被创建或被管理的对象在IOC容器中统称为BeanIOC容器中放的就是一个个的Bean对象 (4)当IOC容器中创建好service和dao对象后程序能正确执行么? 不行因为service运行需要依赖dao对象IOC容器中虽然有service和dao对象但是service对象和dao对象没有任何关系需要把dao对象交给service,也就是说要绑定service和dao对象之间的关系 像这种在容器中建立对象与对象之间的绑定关系就要用到DI:
DIDependency Injection依赖注入 (1) 什么是依赖注入呢? 在容器中建立bean与bean之间的依赖关系的整个过程称为依赖注入业务层要用数据层的类对象以前是自己new的现在自己不new了靠别人[外部其实指的就是IOC容器]来给注入进来这种思想就是依赖注入 (2) IOC容器中哪些bean之间要建立依赖关系呢? 这个需要程序员根据业务需求提前建立好关系如业务层需要依赖数据层service就要和dao建 立依赖关系 介绍完Spring的IOC和DI的概念后我们会发现这两个概念的最终目标就是:充分解耦具体实现靠: 使用IOC容器管理beanIOC)在IOC容器内将有依赖关系的bean进行关系绑定DI最终结果为:使用对象时不仅可以直接从IOC容器中获取并且获取到的bean已经绑定了所有的依 赖关系. 2.3.3 核心概念小结
这节比较重要重点要理解什么是IOC/DI思想、什么是IOC容器和什么是Bean
(1) 什么是IOC/DI思想? IOC:控制反转控制反转的是对象的创建权DI:依赖注入绑定对象与对象之间的依赖关系 (2) 什么是IOC容器? Spring创建了一个容器用来存放所创建的对象这个容器就叫IOC容器 (3)什么是Bean? 容器中所存放的一个个对象就叫Bean或Bean对象 三、入门案例 介绍总结完Spring的核心概念后接下来我们得思考一个问题就是Spring到底是如何来实现IOC和DI的那接下来就通过一些简单的入门案例来演示下具体实现过程: 3.1 IOC入门案例
对于入门案例我们得先分析思路然后再代码实现
3.1.1 入门案例思路分析
(1)Spring是使用容器来管理bean对象的那么管什么? 主要管理项目中所使用到的类对象比如(Service和Dao) (2)如何将被管理的对象告知IOC容器? 使用配置文件 (3)被管理的对象交给IOC容器要想从容器中获取对象就先得思考如何获取到IOC容器? Spring框架提供相应的接口 (4)IOC容器得到后如何从容器中获取bean? 调用Spring框架提供对应接口中的方法 (5)使用Spring导入哪些坐标? 用别人的东西就需要在pom.xml添加对应的依赖 3.1.2 入门案例代码实现 非 Spring 实现 需求分析:将BookServiceImpl和BookDaoImpl交给Spring管理并从容器中获取对应的bean
对象进行方法调用。
1.创建Maven的java项目
2.pom.xml添加Spring的依赖jar包
3.创建BookService,BookServiceImplBookDao和BookDaoImpl四个类
4.resources下添加spring配置文件并完成bean的配置
5.使用Spring提供的接口完成IOC容器的创建
6.从容器中获取对象进行方法调用步骤1:创建Maven项目(前提是已经安装了maven前面文章总结到) 1 创建成功默认显示如下 (2) 创建包创建数据接口 package com.glory.dao;/*** Author:Daniel* Version 1.0*/
public interface BookDao {public void save();
}3 创建数据接口实现类 package com.glory.dao.impl;import com.glory.dao.BookDao;/*** Author:Daniel* Version 1.0*/
public class BookDaoImpl implements BookDao {Overridepublic void save() {System.out.println(book dao save 。。。。);}
}4创建业务接口及其实现类 package com.glory.service;/*** Author:Daniel* Version 1.0*/
public interface BookService {public void save();
}package com.glory.service.impl;import com.glory.dao.BookDao;
import com.glory.dao.impl.BookDaoImpl;
import com.glory.service.BookService;/*** Author:Daniel* Version 1.0*/
public class BookServiceImpl implements BookService {private BookDao bookDao new BookDaoImpl();Overridepublic void save() {System.out.println(book service save。。。。);bookDao.save();}
}5测试 package com.glory.service;import com.glory.service.impl.BookServiceImpl;/*** Author:Daniel* Version 1.0*/
public class App {public static void main(String[] args) {BookService bookService new BookServiceImpl();bookService.save();}
}Spring 实现 步骤1:创建Maven项目(上面已创建)步骤2:添加Spring的依赖jar包 pom.xml dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.2.10.RELEASE/version/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency
/dependencies步骤3:添加案例中需要的类 创建BookService,BookServiceImplBookDao和BookDaoImpl四个类 (上面已创建234) 步骤4:添加spring配置文件 resources下添加spring配置文件applicationContext.xml并完成bean的配置 步骤5:在配置文件中完成bean的配置 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
--bean idbookDao classcom.glory.dao.impl.BookDaoImpl/beanbean idbookService classcom.glory.service.impl.BookServiceImpl/bean
/beans注意事项bean定义时id属性在同一个上下文中(配置文件)不能重复 步骤6:获取IOC容器 使用Spring提供的接口完成IOC容器的创建创建App类编写main方法 步骤7:从容器中获取对象进行方法调用 package com.glory.service;import com.glory.dao.BookDao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** Author:Daniel* Version 1.0*/
public class App2 {public static void main(String[] args) {//获取IOC容器ApplicationContext act new ClassPathXmlApplicationContext(spring_applicationContext.xml);// BookDao bookDao (BookDao) act.getBean(bookDao);BookService bookService (BookService) act.getBean(bookService);// bookDao.save();bookService.save();}
}步骤8:运行程序 测试结果为 Spring的IOC入门案例已经完成但是在BookServiceImpl的类中依然存在BookDaoImpl对象的 new操作它们之间的耦合度还是比较高这块该如何解决就需要用到下面的DI:依赖注入。 3.2 DI入门案例 对于DI的入门案例我们依然先分析思路然后再代码实现 3.2.1 入门案例思路分析
(1)要想实现依赖注入必须要基于IOC管理Bean DI的入门案例要依赖于前面IOC的入门案例 (2)Service中使用new形式创建的Dao对象是否保留? 需要删除掉最终要使用IOC容器中的bean对象 (3)Service中需要的Dao对象如何进入到Service中? 在Service中提供方法让Spring的IOC容器可以通过该方法传入bean对象 (4)Service与Dao间的关系如何描述? 使用配置文件 3.2.2 入门案例代码实现
需求:基于IOC入门案例在BookServiceImpl类中删除new对象的方式使用Spring的DI完成
Dao层的注入
1.删除业务层中使用new的方式创建的dao对象
2.在业务层提供BookDao的setter方法
3.在配置文件中添加依赖注入的配置
4.运行程序调用方法步骤1: 去除代码中的new 在BookServiceImpl类中删除业务层中使用new的方式创建的dao对象 步骤2:为属性提供setter方法 在BookServiceImpl类中,为BookDao提供setter方法 package com.glory.service.impl;import com.glory.dao.BookDao;
import com.glory.dao.impl.BookDaoImpl;
import com.glory.service.BookService;/*** Author:Daniel* Version 1.0*/
public class BookServiceImpl implements BookService {//删除业务层中使用new的方式创建的dao对象//private BookDao bookDao new BookDaoImpl();private BookDao bookDao;Overridepublic void save() {System.out.println(book service save。。。。);bookDao.save();}//提供对应的set方法public void setBookDao(BookDao bookDao) {this.bookDao bookDao;}
}步骤3:修改配置完成注入 在配置文件中添加依赖注入的配置 ?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd!--bean标签标示配置bean
id属性标示给bean起名字
class属性表示给bean定义类型
--bean idbookDao classcom.glory.dao.impl.BookDaoImpl/beanbean idbookService classcom.glory.service.impl.BookServiceImpl!--配置server与dao的关系--!--property标签表示配置当前bean的属性name属性表示配置哪一个具体的属性ref属性表示参照哪一个bean--property namebookDao refbookDao/property/bean
/beans注意:配置中的两个bookDao的含义是不一样的 namebookDao中bookDao的作用是让Spring的IOC容器在获取到名称后将首字母大写前 面加set找对应的setBookDao()方法进行对象注入refbookDao中bookDao的作用是让Spring能在IOC容器中找到id为bookDao的Bean对象给 bookService进行注入 综上所述对应关系如下: 步骤4:运行程序 运行测试结果为