【一篇搞懂】Spring学习丨黑马程序员(学习笔记) |
您所在的位置:网站首页 › 黑马程序员电话 › 【一篇搞懂】Spring学习丨黑马程序员(学习笔记) |
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、前言🚀🚀🚀二、Spring简介及学习路线:☀️☀️☀️1.初识Spring1.1 spring全家桶1.2 Spring发展史 2.Spring系统架构2.1 Spring Framework系统架构2.2 Spring 学习路线: 三、Spring全面学习:☀️☀️☀️1. 核心概念1.1 IoC控制反转/DI(1) IoC入门案例(2) DI入门案例 2. bean配置2.1 bean基础配置2.2 bean实例化(1)使用构造方法(常用)(2)使用静态工厂实例化bean(了解)(3)实例工厂实例化bean(了解)(4)FactoryBean实例化bean(务必要掌握) 2.3 bean的生命周期 2. 依赖注入2.1 使用setter注入一一引用类型2.2 使用setter注入一一简单类型2.3使用构造器注入一一简单类型2.4使用构造器注入一一引用类型(了解)2.5 依赖自动装配(功能强大)2.6 集合注入2.7 案例:数据源对象管理2.8 加载properties文件 +开启命名空间方式 3. 容器3. 2 容器、bean、依赖注入相关一一总结 4.注解开发4.1 注解开发定义bean4.2 纯注解开发4.3 注解开发bean作用范围和生命周期4.4 注解开发依赖注入4.4.1 自动装配4.4.2 读取properties文件 4.5 注解开发管理第三方bean4.5 注解开发总结 5. Spring整合MyBaits开发5.1 回顾mybatis独立开发5.2 Spring整合mybatis5.2.1 pom文件中加相应坐标5.2.2 选用注解开发(准备工作)5.2.3 开始mybatis整合 5.3 Spring整合JUnit 6. AOP6.1 AOP简介6.1.1 AOP核心概念6.1.2 AOP作用 6.1 AOP入门案例6.2 AOP工作流程6.3 AOP切入点表达式6.4 AOP通知类型6.4 案例:测量业务层接口执行万次执行效率6.5 AOP通知获取数据6.6 案例:百度网盘密码数据兼容处理6.7 AOP总结 7. Spring事务7.1 Spring事务是怎么做的7.2 Spring事务角色7.3 Spring事务属性 四、总结:🍓🍓🍓 一、前言🚀🚀🚀☀️ 风是自由的,你也是。 本文简介:本人是大二软件工程专业,java后端方向,学习路线:java基础->JDBC->Maven->MyBatis->SSM,通过做笔记分享到博客上的形式,激励自己学习,同时方便复习。由于水平为入门级别,如有错误,希望大佬们评论或私信斧正 Thanks♪(・ω・))ノ 二、Spring简介及学习路线:☀️☀️☀️ 1.初识Spring 1.1 spring全家桶 下列这三个技术,基本上能够应对我们企业级开发所有的主流开发功能。这套课程我们讲的是Spring Framework,而这个技术是怎么发展过来的: Spring1.0 在2004年问世。现在24年已经到Spirng6了。。到了5的时候,spring框架全面支持jdk8,你要想做spring开发,你的jdk版本至少是8及以上。
第一个模块叫核心容器,Core Container,这个模块是spring框架中最核心的部分,其他所有模块都是依赖它运行的。看到容器(装对象的),根据这样的一个结构设计来看,spirng是用来管对象的技术。 第二块叫AOP(面向切面编程),它放在这个位置说明了它要依赖核心容器的执行,跟面向对象编程一样,它也是一种编程的思想,教你程序应该怎么做,又是一种设计型的概念。具体是做什么的呢?它可以在不惊动原始程序的基础上,给它增强功能,aspect也是对aop思想进行了实现,spring发现aspect技术做的非常好了,于是大胆地将其收录到它的整个技术栈中(所以后面我们学习spirng的aop开发的时候,除了要导aop坐标,还要导aspect坐标) 第三块,叫做Data Access,在整个数据访问的这个大的模块中,Transactions需要单独介绍(spring在事务这个方面做了非常大的突破,开发起来效率非常高的控制方案。) 第四块Web开发这方面,这部分内容到后续的spring mvc的课程中再详细学习。 最下面,test(做测试的) spring在单元测试 (主要学习)和集成测试页给我们提供了一些帮助性的操作。 2.2 Spring 学习路线: 引入: 将实现类去掉变成接口 new一个对象直接转为外部(Ioc容器,要管大量的对象,也是前面讲的Core Container)提供对象。 现在程序要使用servic对象,IoC可以给你造,但是问题来了,程序运行完,你的service运行完需要Dao,但是你光给我造了个service对象,但是需要Dao才能运行,这两个对象都在IoC容器中,直接把两个bean绑关系。这个过程叫 依赖注入。 (有关系才能绑) 目标 思路分析 业务层service: 接口中对应的实现类在数据层。 数据层dao: 要交给它管理,需要创建个配置文件 发现没有spring这种结构,原因是还没导包呢,去pom.xml文件导入spring坐标。这里用的是5210的版本,相对稳定了。 加入dependency标签后,加完坐标,便在maven这里刷新一下便可以。 文件创建完后名称叫applicationContext.xml。 创建一个App2.java文件,获取IoC容器,拿到Dao对象 这里是运行两行。 IoC入门案例步骤小总结
1.基于上一个的基础上往下做,基于IoC管理bean。 2.Service中使用new形式创建的Dao对象是否保留?(否) 3.Service中需要的Dao对象如何进入带Service中?(提供方法) 4.Service与Dao间的关系如何描述?(配置) 1.2.3步骤
2. bean配置 2.1 bean基础配置 问题:bean的id你写好了,但你的命名习惯跟我的不太一样,我想换个名称。 方法:bean的别名,在配置文件xml中可以弄,通过name标签,中间隔空格或逗号分隔。 下图代码运行结果可以看出Spring创建的是单例对象。那要创建非单例的怎么办?要通过配置的形式完成了,我们需要在bean的属性中再加一个属性scope(作用范围),我们不写默认就是singleton,把它换成prototype,再来运行,它会是两个不同的地址,就是不同的对象了。
那么bean是怎么创建出来的呢? 2.2 bean实例化 (1)使用构造方法(常用)bean本质上就是对象,创建bean使用构造方法完成 现在创建了一个全新的模块 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/e98a663780c344f7bac08ed 003577710.png) 加一个构造方法再运行一下,再搞个private私有的发现还可以访问到(运行结果一样)然后给该构造方法加个参数int i,发现报错了,说明spring创建bean的时候,调用的是无参的构造方法。这就是第一种实例化bean的方式一一用构造方法实例化对象。
这里学个知识点:看spring报错信息: 拉到最后面,看最后的信息,然后再看倒数第二个。 这里就是调用一个有参的构造方法,但是它没有所以就报错了。 小总结 第一种实例化bean的方式: (2)使用静态工厂实例化bean(了解) 回顾:前面说使用静态工厂也能创建对象?这些年用的少,但早些年用的比较多。 什么东西都不用动,加这个东西就OK了。
小结论: 第三种方法做了个改良,使得在配置的时候更加方便。 小结论: 指定泛型以后,里面所有的类型都要对准这个泛型,配置的时候就跟我们原来的写法一样,注意:配置这里造出来的对象不是FactoryBean的对象,而是上面FactoryBean接口中getObject()造出来的对象。
把这两方法加上去运行发现是不会执行这两方法的,why? 要做配置,在这里改。 在bean id = bookDao,这里加两个属性,然后再执行,发现只有init操作,但是销毁操作并没有执行,why?
这个close方法是从哪来的?是从它上面的父类继承过来的,追到最后是下面这个接口中来的。 那么想要在我们的程序中正常关闭bean怎么办,复制这个类,然后粘到前面即可。这种关闭的方式是比较暴力的。 方法二: 注册关闭钩子,两者的区别,close关闭相对来说暴力一些,直接关容器,registerShutdownHook则可以放在任意位置。其实这两者在我们实际开发中都不需要写,我们最终做的是web应用,关闭容器这件事是包括TomCat一块的,到后面web那里再说。 总结
这样配applicationContext.xml文件,如下图:
主要学个格式
第三方资源配置管理 我现在管的bean不是我自己写的,别人的。 导入连接池对象。 学到这里发现,这里也是出现硬编码的问题,代码也是写死了,如果后期账号密码要修改,还要跑到这里修改代码,维护性有待提高,那么接下来怎么办呢?
以后要是有新的命名空间,基本上都是这个套路。
前提:从spring2.0开启,提供了各种各样的注解,到了2.5的时候就比较完善了。第一个内容是2.5,到了spring3.0的时候就推出了纯注解开发,也就是我们要讲的第二个内容。 4.1 注解开发定义bean
意味着一点配置文件都不写了
4.3 注解开发bean作用范围和生命周期
4.4 注解开发依赖注入 4.4.1 自动装配
没有配置,只能用编程写。回到手写代码0.0
运行一下App,发现bean已经被创建出来了。
总结:@Bean以后会经常用到,整合框架必须用到,都不是你自己写的,都是别人写的,所以你肯定得用它。 4.5 注解开发总结
5. Spring整合MyBaits开发 5.1 回顾mybatis独立开发 先快速回顾一下Mybatis独立开发是怎么做的, 进入idea中,这里建了一个全新的模块,里边是一套最基本的mybatis操作。 1.先看一下操作的数据库表: 3.对应的数据层操作接口(),看到着我们能发现是用注解型,在我们的配置文件中就没有那个映射的.xml文件了。 4.没有实现类,说明是用自动代理做的。 5.看一下核心配置,加载jdbc配置 6.这些配置都是比较常规的了,直接下一步看应用程序。 7.首先前三行是造sqlSessionFactory对象。 这里分析得出核心对象为SqlSessionFactory, 这方框里面的数据库连接信息也是为了SqlSessionFactory服务的,而mappers这里是属于我们的业务操作,不属于Mybatis管,所以这一块是伴随着业务改变的。所以到这里应该得出的结论是:mybatis应该管SqlSessionFactory对象。 5.2 Spring整合mybatis 5.2.1 pom文件中加相应坐标1.打开pom,我们看看现在有哪些坐标,spring-context核心,然后对于我们后面的这个数据源,我们就用druid数据源了,咱们已经整合过了,再往下,mybatis对应的jar包,这个必定少不了,以及mysql对应的jar包。 那么下面还需要两个包,第一个是 spring操作jdbc 用的包, spring-jdbc ,另一个就是 spring整合mybatis 需要用到的jar包。问题:spring跟很多技术整合,那么需要的包是spirng做还是其他技术做呢?(spirng开放出接口标准,你和我整合,你只需要按标准做就行了,等到新技术出现了,它想和spirng整合,按照标准开发即可。) 这里的version不能乱写,要对应好相应的mybatis版本, 1.创建config.SpringConfig类,做一下数据源, 第三方bean管理,上面引用的变量值从jdbc.properties中来。 @import手动导入,到下面这里就把所有准备工作做完了。
这里则需要重新建一个类放mybatis的内容。 这里的SqlSessionFactory要全部初始化好,既然这些大量的工作都要做,干脆我给你来一个快速创建SqlSessionFactory的东西,叫做SqlSessionFactoryBean,这是个全新的类。 这个SqlSessionFactoryBean来自于这个org.mybatis.spring包。这是mybatis整合spring的包,也是前面导坐标导的这个东西。
我们之前说过但凡是FactoryBean的东西都是造对象,看清楚,它这里实现接口,专门造SqlSessionFactory。这里的getObject()就是返回SqlSessionFactory对象,欧啦。 那么这个SqlSessionFactoryBean该怎么做呢?往里面set东西。 到这里是不是已经整合完了呢???还没有!!! 打开你的配置,来看一下这个,这个 mappers 当我们去 扫描 我们的那个配置最终使用自动代理的形式,帮我们造dao的实现类的。 MapperScannerConfigurer类对象跟上面一样,直接new一个即可,然后返回这个对象。setBasePackage问你映射在哪个包下。 到这里mybatis整合就做好了。以后就是把这几行一复制,改两个package路径,然后就做完了。
解读: 这里getBean注意,不需要拿那个dao,因为我们的dao已经注入到service中了,所以这个直接getBean(AccountService.class)。下面就直接调用findById(),传入一个2,运行完发现OK。到这里其实我们就做完了。 小结
其实就是基于spring环境,我们把测试给搞出来。下面我们做的就是text模块下面的测试。 1.创建一个测试类AccountServiceText,测业务层接口(比较多,当然也可以测数据层接口),如果要想让它成为一个测试用例,那必须要到junit包, 导完坐标后刷新一下功能。 整合: @RunWith(),设定类运行器,这是Spring整合junit的专用运行器。 @ContexConfiguration 配置. 先定义一个业务层接口,要想保证这里能用它,@Autowired。 下面顺便写一个测试方法,顺便跳,这里写testFindId, 我们说过spring有两大特征,一个是ioc,应该是aop。 代码不变的基础下增强功能。
6.1 AOP入门案例 开发有两种模式:XML or 注解,这里是用注解的模式,效率 高。 导包这里,aop的坐标除了aop以外,还要导aspectj。
第四步:这里表明当执行到这个方法的时候,这就是一个切入点。 这里的关系就叫切面。绑定切入点与通知关系,@Before()。
第六步: 这里解读下面整篇代码 ①@Component:告诉spring来加载我 ②加个这@Aspect,告诉spring,这个东西是用来做AOP的。 ③@Pointcut,定义好你的切入点。 ④public void before(){} 定义好你的通知。 ⑤@Before(),把切入点和通知绑定好,就OK了。 第七步:加入@EnableAsepctJAutoProxy,告诉spring我这里有用注解开发的AOP,换句话说,这句话启动了我们配置里面的@Aspect,而这句话则告诉你,你进去识别类里面的内容。
上面的代码:这里读取第二个切入点,因为它下面@Before配置了第二个切入点。 选的切入点是否能跟类中的某个方法配上。 spring的aop模式就是代理模式做的,AOP的整个工作,实际上就是用了代理模式。 6.3 AOP切入点表达式 这里的表达式是指写一句话来表达这个方法。 返回值,包,接口,方法. 这里的疑问,一个程序中要是有很多功能,然后你挨个写切入点表达式,不得把你写死?怎么办勒?往下看。一一>通配符,在AOP中,描述切入点可以使用通配符,加速配置,加速描述。 6.4 AOP通知类型 上一节,咱们研究的是切入点表达式,就是控制给谁加AOP,这一节我们研究的更详细一点,也就是AOP的控制类型。这一节中,我们要介绍几种不同的控制类型。 前置通知 环绕通知,这里我们想让两条语句加在原先的前后,但是这里增强不要紧,直接把我原始操作给隔离了,因为我们在这是做环绕通知,环绕的话肯定是在原始操作的前或后,这里必须有一句话表示对原始操作的调用,格式非常固定。这里pjp.proceed(); 这句话表示对原始操作的调用。 小总结: 不想用原始操作,可以用Around方法注解进行隔离。有什么用呢,比如说你可以做一些权限校验,你呢现在想要运行我的方法,你必须得是一个经理的权限,那好我拿过来看看你是不是经理,如果是,那好你执行,如果不是那这个操作不允许你执行。 这里的例子其实听着有点小萌比,等以后再过来看看这一块。 这里应该就能稍微想明白,怎样对原始操作做隔离,以及为什么出现隔离这种效果。 就是我不想让你调原始操作。
6.4 案例:测量业务层接口执行万次执行效率 这一节我们就要结合前面所学的AOP切入点怎么配,AOP切入类型怎么设来做一个案例。做的就是我们学习AOP做的第一个案例,叫做测量业务层接口执行万次执行效率。 这样的操作还是有点问题的,区分不了是谁。于是。
就是这里要求输入五位,然后这里四位,百度的服务器里面会不会在密码里面自动给你们加一个空格? 不会啊。。 所以在很多网站上面,当用户输入信息后,空格都要处理一下。 写个AOP数据处理类:
AOP是一种编程范式,是指导我们软件如何开发设计的。
事务本身的作用就是为了保证我们数据库操作的一致性。(操作执行同时成功或失败) spring给出了一个最基本的事务管理器实现,这是一个实现类DataSourceTransactionManager,就是你给我对应的dataSource后,我就能够帮你在业务层开事务,但是它的内部是用jdbc的事务,你现在用的技术是jdbc的技术,就可以用它这个事务管理器的实现对象,很巧合的是,我们Mybatis内部就是jdbc的事务,所以后面我们spring整合mybatis,如果要使用spring的事务,就用这个实现就行。 ![]() 程序中,首先,转账接口,把你要转账的两个账户给我,把金额给我,就可以进行转账。而数据层接口,是两个操作,一个是进钱,一个是出钱。最后我们通过测试用例,测试结果。
第二步是到我们的配置中,配置一个spring事务管理器, 如下图: 第三步:你在接口上开了这个东西,但是spring还不知道以事务注解的形式做事务,所以第三步要到spirng配置文件中告诉spring我们现在是用注解形式做事务了。 如下图: 加入@EnableTransactionManagement
7.2 Spring事务角色 这两个操作分别对应的数据层操作。 而在transfer类前加个**@Transactional代表着开启事务**。一旦开启后,是不是意味着一共有三个事务,那现在三个谁都不挨谁阿,于是spirng就做了一件事,你们两个事务既然都在我的控制范围内,你们这两个事务都改成和我一样的事务,全都加到我的事务中。 现在我们的整体操作就只有一个事务了,正因为只有一个事务,所以在它的范围内,一旦出现了异常,它就会将事务回滚,就可以做到所有操作同时执行或同时不执行。 进行一下划分,我们将spring开启的这个事务叫做事务管理员,我们将加入到spring事务中的这个成员叫做事务协调员, 要在数据库进行留痕。
这里就要改一下了,不仅要调用out,inMoney这两个操作,这里边要调用我们两个事务,
到这呢,这段程序算是写完了。
事务传播行为的所有情况。 四、总结:🍓🍓🍓 碎碎念: 现在是2024.5.28凌晨0:36,终于把spirng这一块学完了,由于时间有点赶,这里就暂时不做什么多的总结了,先小结一下spring,刚开始对spring以为就是一种技术,很容易上手,但实则spring包含很多东西,它不仅仅是一个框架,它有Ioc控制反转(解决代码高耦合,不用new对象了,让外部提供对象)、DI 依赖注入 (这个也是学spring后才发现的一个重点内容),bean(对象)配置,到后面的纯注解开发(发现可以不用谢配置文件),原来一路学下来,有挺多技术都是不怎么用的,但是之所以要学它是因为新技术在学它的基础上更好理解和应用(个人想法以后可能会有些许变化)。大概就先概述这么多吧,晚安~ 一一2024/5/28 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |