Java后端框架---Spring

目录

一.Spring是什么?

二.Spring Hello World 搭建

三.XML配置bean管理

1.bean标签

 2.依赖注入

 3.依赖注入的补充

 四.注解配置bean管理

1.开启注解扫描

 2.使用注解对类进行配置

3.自动注入

五.面向切面编程AOP

1.概述

2.通知

六.spring事务管理

1.数据库事务管理

2.spring事务管理

3.基于注解实现的spring事务管理

 4.spring事务管理的使用

七.spring集成mybatis

1.导入mybatis--spring 插件包

 2.在spring.xml中配置 sqlSessionFactory

 3.指定生成接口代理

4.在service中注入Dao代理接口

总结


一.Spring是什么?

Spring 是一个轻量级的,IOCAOP一站式 Java 开发框架,是为了简化企业级应用开发而生的。

轻量级:框架体积小(核心模块)

IOCInversion of Control 控制反转,把创建对象的控制权交给Spring框架,而非传统实现中由程序代码直接操控.

AOP:Aspect Oriented Programming 面向切面编程,将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来,使用的是动态代理的机制实现,在我们的业务代码中不显示地调用,但是业务代码的执行会通过代理对象调用。

Spring的官方网址:https://spring.io/

二.Spring Hello World 搭建

1.创建一个普通的maven项目

通过maven导入 spring 核心基础的 jar 包

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

 2.编写spring的配置文件

以spring.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/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
</beans>

 在 resources 包下创建一个spring的配置文件,将上述代码复制到此中。

3.编写一个实体类

在 java 包下创建一个实体类(包含get set方法,无参,有参构造方法)。

eg:这里用Person来举例。

4.在spring.xml文件中配置实体类信息

这里用到<bean>标签,里面的两个参数:id="标签名" class="这里写的是集成进来的类的全类名"
<bean id="person" class="com.zyk.springpro.model.Person"></bean>

5.定义一个测试类

在测试类中,需要将在配置文件中配置的实体类信息给集成进来,就要用到:

ClassPathXmlApplicationContext()是spring框架中的一个具体的实现类,负责生成,管理对象中的类可以看作是一个容器,所以一般把spring框架称为spring容器或者IOC容器。

 ApplicationContext applicationContext= new ClassPathXmlApplicationContext("spring.xml");

 想要得到实体类对象就需要 getBean() 方法:

getBean()方法:让spring框架去生成类(集成进spring中的)的对象。

Person person =(Person) applicationContext.getBean("person");
Person person1 = applicationContext.getBean("person",Person.class);

 参数中写的就是刚才在 spring.xml 配置文件中的配置的 id 。getBean()中参数若只有一个配置信息的id,那么返回值就是Object类的对象,想要得到Person类就需要强制转型;参数中还有一个Class类的对象,返回值的类型就会很明确了。

三.XML配置bean管理

1.bean标签

在bean标签中的基本属性:

id="对象名称,可以在getBean中获得spring对象"
class="让spring管理的类的地址"
scope="配置bean的作用域"
scope="singleton" 单例的 会在启动spring框架的时候调用 并且后续使用getBean()生成的对象地址都是一样的,是同一个对象
scope="prototype" 原型的(多例的) 后续getBean()生成的对象地址都是不一样的 都不是一个对象

 2.依赖注入

依赖注入:在创建对象时,给对象中的属性赋初值。

(1)通过属性注入 set方法

使用到<bean>标签下的<property>标签,通过标签中的 name value 属性进行针对性的对类中的成员变量进行赋值操作。

<bean id="person" class="com.zyk.springpro.model.Person" scope="prototype"><property name="id" value="20041026"></property><property name="name" value="芋泥"></property>
</bean>

 (2)通过构造方法进行注入

使用到<bean>标签下的<constructor-arg>标签,同样通过标签中的 namevalue 属性进行针对性的对类中的成员变量进行赋值操作。

<bean id="person" class="com.zyk.springpro.model.Person" scope="prototype"><constructor-arg name="id" value="20041026"></constructor-arg><constructor-arg name="name" value="mark"></constructor-arg>
</bean>

 3.依赖注入的补充

在一个类(A)中有其他类(B)作为属性,调用类B中的方法,这个时候就需要将两个类都配置在spring.xml文件中。

<!--
PersonService类中有PersonDao类型的属性,其中必需要存在对应的get和set方法,所以new的对象应该是PersonService的对象通过PersonService然后再调用其中的PersonDao类中的savePerson()方法,这个时候就需要用到<property>中的ref属性,属性中找的是在spring.xml中配置的对应类的id
-->
<bean id="personDao" class="com.zyk.springpro.dao.PersonDao" scope="prototype"></bean><bean id="personService" class="com.zyk.springpro.service.PersonService" scope="prototype"><property name="personDao" ref="personDao"></property>
</bean>

 在<property>标签中,对于属性是某一个类的时候,就需要使用到 ref 属性 ,属性中找的是在spring.xml中配置的对应类的 id 。

调用:

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
//PersonService中有PersonDao属性
PersonService personService = classPathXmlApplicationContext.getBean("personService", PersonService.class);
//savePerson()是PersonService中的方法,此方法中调用了属性(PersonDao中的方法savePerson())
personService.savePerson();

 四.注解配置bean管理

1.开启注解扫描

首先,要想使用注解的方式对bean进行管理,就需要先在spring.xml文件中去开启注解扫描

<!--开启注解扫描,配置文件中没有这个标签,还需要定义进来,开启后就可以使用注解降低代码量了-->
<!--包名就写到springpro-->
<context:component-scan base-package="com.zyk.springpro"> </context:component-scan>

 2.使用注解对类进行配置

对于Model层(模型类):一般使用 @Component 注释,其中有一个变量 value 相当于在xml配置bean管理中的 id 。

对于模型类还有一个注解: @Scope 用来配置bean的作用域 其中的变量 value 可以是 singleton(单例的)和 prototype(原型的)。

@Component(value = "person") 
//相当于 <bean id="person" class="com.zyk.springpro.model.Person">
@Scope(value = "prototype")  
//相当于  scope="prototype" 原型的  singleton 单例的

对于Dao层(直接与数据库打交道的类):一般使用 @Repository 注解,其中也有一个 value 变量。

对于Service层:一般使用 @Service 注解,其中也有一个 value 变量。

在Service层当中,如果存在属性是其它类的对象时,在此对象前也需要加上 @Autowired 注解,就可以不用对对象属性进行初始化赋值重写 set 和 get 方法了,而且对象不能为空。

注意:@Component ,@Repository,@Service 注解都可以实现创建对象的功能,只是为了后续扩展功能,在不同的层使用不同的注解标记。

3.自动注入

@Autowired是spring框架提供的注解,用于属性和属性的 set 方法上,如果写在属性上就可以不写set方法,默认情况下注入的值不能为空,默认注解中的属性 required=true。

@Qualifier 也是自动注入使用的注解,其中有一个 value 属性,通过对象名字来查找注入。

自动注入有两种匹配的方式:

(1)使用属性的类型查找

(2)通过对象的名字查找

@Resource 是 java 语言中提供的注解标签,也是添加在属性上,不需要写 set 方法,注入的值也是不能为空的,可以通过类型来自动注入(@Resource),也可以通过对象名字来查找要注入的对象(@Resource(name="personDao"))

五.面向切面编程AOP

1.概述

      面向切面编程是对面向对象编程的补充延续,面向切面编程思想是将程序中的非业务代码(提交事务,打印日志,权限验证,统一异常处理)在调用业务代码时,通过一个代理对象帮助我们调用这些提取出来的非业务代码,这样在业务代码当中就不用显示的调用非业务代码,这样最终就做到了业务代码和非业务代码的分离,降低了耦合度。

面向切面编程的好处:降低了模块之间的耦合度。

面向切面编程的原理:采用动态代理模式,给业务代码生成代理对象。

2.通知

在使用通知之前,需要在spring.xml中开启自动代理

<!--开启自动代理-->
<aop:aspectj-autoproxy />

AspectJ 中常用的通知有五种类型:

使用通知的类前需要加上:@Component @Aspect 注解才可以使用通知

前置通知,后置通知,环绕通知,异常通知,返回通知.

@Before 前置通知:方法执行之前

@After 后置通知:方法执行之后,无论是否出现异常

@AfterReturnning 返回通知:方法成功执行之后通知,出现异常不执行

通知后面的参数可以用来设置哪些类中的哪些方法经过此非业务代码,具体实例如下:

@AfterThrowing 异常通知:抛出异常之后通知 

异常通知中还有 throwing 参数,主要是出现异常后用来打印异常信息使用的。

@Around 环绕通知:方法执行前后都有通知

环绕通知中,包含了以上四种通知类型,而且在 try 代码块中还可以获取目标方法的参数以及调用目标业务方法。

@Around(value = "execution(* com.zyk.springpro.dao.PersonDao.*(..))")
public void aroud(ProceedingJoinPoint joinPoint){try {System.out.println("前置通知");Object[] args = joinPoint.getArgs();  //获取到目标方法的参数System.out.println(Arrays.toString(args));Object proceed = joinPoint.proceed(); //调用目标业务方法System.out.println("返回通知");} catch (Throwable throwable) {throwable.printStackTrace();System.out.println("异常通知");}System.out.println("后置通知");
}

六.spring事务管理

1.数据库事务管理

       数据库事务管理就是对一次数据库操作过程中执行的多条语句进行管理,保 证一次对数据库操作过程中多条 sql 要么都执行成功,要么都不执行,从而确保数 据一致性. 我们在开发企业应用时,对于业务人员的一个操作实际是对数据读写的多步操作的结合。由于数据操作在顺序执行的过程中,任何一步操作都有可能发生异常,异常会导致后续操作无法完成,此时由于业务逻辑并未正确的完成,之前成功操作数据的并不可靠,需要在这种情况下进行回退。事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作要么都完成,要么都取消,从而保证数据满足一致性的要求。

2.spring事务管理

事务管理本质上是数据库提供的一种管理机制,spring事务管理只是对于事务提交这一功能进行了封装。Spring 事务管理就是 spring 框架针对程序中提交事务这部分非业务代码进行分离管理,减轻程序员负担.在程序执行没有问题时,提交事务,出现问题时,回滚事务。(是对一次数据库操作过程中执行的多条sql语句进行管理,确保一次操作过程中的多条sql语句都执行成功,要么就都不执行)

spring事务管理分为两种形式:

(1)编程式事务管理:需要在代码中自己控制事物的提交和回滚。

(2)声明式事务管理:建立在AOP的基础上,本质上是对方法前后进行拦截,所以声明式事务管理是方法级别的。

3.基于注解实现的spring事务管理

Spring 框架,提供事物管理实现类是 DataSourceTransactionManager.

想要使用spring事务管理,首先需要在spring.xml中配置spring事务管理器:

<!-- 配置 spring 事务管理器-->

<bean id="transactionManager"

      class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

     <property name="dataSource" ref="dataSource"></property>

</bean>

与此同时,还需要开启注释事务管理:

<!-- 开启注解事务管理 -->

 <tx:annotation-driven transaction-manager="transactionManager"/>

 4.spring事务管理的使用

由于我们已经做好了spring事务管理的配置信息,下面可以在需要进行spring事务管理的类/方法前加上 @Transactional 注解标签,就可以对此类/方法进行事务管理了。

 5.声明式事务不生效的场景

在下面几种情况下,即使我们加上了 @Transactional 注解,仍然没有进行事务管理。

(1)标签用在 非public 方法上

(2)异常被catch捕获。

(3)出现编译期异常。eg:

 在 @Transactional 上还有一个 rollbackFor 变量,可以使变量的值等于 Exception.class ,使事务可以接受所有的异常种类。

(4)数据库引擎不支持事务

在 Mysql 中,目前只有  InnoDB 支持事务管理,其他引擎都是不支持的。

七.spring集成mybatis

Spring 集成 Mybatis 其核心是将 SqlSessionFactory 交由 Spring 管理,并由Spring 管理对 dao 接口的代理实现。

1.导入mybatis--spring 插件包

<dependency>

     <groupId>org.mybatis</groupId>

     <artifactId>mybatis-spring</artifactId>

     <version>1.3.1</version>

</dependency>

 2.在spring.xml中配置 sqlSessionFactory

<!--配置 sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="druidDataSource"></property><property name="configLocation" value="classpath:mybatis.xml"></property>  <!--扫描mybatis配置文件--><property name="mapperLocations" value="classpath:mappers/*Mapper.xml">   <!--扫描mapper映射文件--></property>
</bean>

 3.指定生成接口代理

<!--指定生成接口代理-->
<bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.zyk.ssm.dao"></property> <!--指定接口所在的包--><property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>

4.在service中注入Dao代理接口


总结

本篇博客总结出Java后端框架--Spring的体系结构,指出 IOC(控制反转) 和 AOP(面向切面编程) 的思想和具体的实现,同时还指出spring中的事务管理以及在spring中集成mybatis的详细步骤。

喜欢博主这篇博客的同学可以三连支持起来!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425035.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络原理(3)—— 应用层、传输层(TCP)

1. 应用层 日常开发中最常用到的一层&#xff0c;主要涉及到两种情况&#xff1a; 1) 使用现成的应用层协议 2) 自己定义应用层协议 1.1 自定义应用层协议的流程 1. 明确前后端交互过程中需要传递哪些信息 实例&#xff1a;开发一个外卖软件 打开软件&#xff0c;首先需要展…

Linux 文件 IO 管理(第一讲)

Linux 文件 IO 管理&#xff08;第一讲&#xff09; 回顾 C 语言文件操作&#xff0c;提炼理解新创建的文件为什么被放在可执行文件的同级目录下&#xff1f;上述 log.txt 何时被创建&#xff1f;又是谁在打开它&#xff1f;那文件没有被打开的时候在哪里&#xff1f;一个进程可…

css 个人喜欢的样式 速查笔记

起因&#xff0c; 目的: 记录自己喜欢的&#xff0c; 觉得比较好看的 css. 下次用的时候&#xff0c;直接复制&#xff0c;很方便。 1. 个人 html 模板&#xff0c; 导入常用的 link 设置英语字体: Noto导入默认的 css使用网络 icon 图标导入 Bootstrap css 框架 html <…

【Python】谷歌浏览器总是自动更新,使用selenium跟chromedriver版本不匹配怎么办?

我发现&#xff0c;我的电脑对谷歌浏览器的禁止自动更新无效&#xff0c;哪怕是在任务计划程序里&#xff0c;禁止谷歌浏览器更新&#xff0c;也没有用。而且有时候点开右上角的三个点&#xff0c;也会自动更新版本。 但是往往chromedriver的更新版本更不上浏览器的版本哇&…

RPC远程调用的序列化框架

序列化框架对比&#xff1a; 一、Java Serialiazer 字段serialVersionUID的作用是为了在序列化时保持版本的兼容性&#xff0c;即版本升级时反序列化仍保持对象的唯一性。 //序列化 ByteArrayOutputStream bout new ByteArrayOutputStream(); ObjectOutoutStream out new O…

测试-Gatling 与性能测试

Gatling 与性能测试详解 一、什么是性能测试&#xff1f; 性能测试是一种软件测试类型&#xff0c;旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试&#xff0c;开发者和运维团队能够识别出系统的瓶颈、优化系统性能&#xff0c;并确保其在实际…

使用kkFileView的几个问题

经测试&#xff0c;可以正常的预览&#xff1a;pdf&#xff0c;png&#xff0c;pptx&#xff0c;psd&#xff0c;zip&#xff0c;word&#xff0c;dcm(医学片子 dr ct等) 部署发布&#xff08;Linux&#xff09; 一、上传到服务器 上传jar包&#xff08;或者官方社区提供的包…

【Linux】精通GDB:打造你的Linux调试超能力

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;C从入门到精通 目录 一&#xff1a; &#x1f525; 什么是GDB / CGDB 二&#xff1a; &#x1f525; CGDB的安装 &#x1f34a; Linux-centos 三&#xff1a; &#x1f525; cgdb的使用背景 &#…

深度剖析iOS渲染

iOS App 图形图像渲染的基本流程&#xff1a; 1.CPU&#xff1a;完成对象的创建和销毁、对象属性的调整、布局计算、文本的计算和排版、图片的格式转换和解码、图像的绘制。 2.GPU&#xff1a;GPU拿到CPU计算好的显示内容&#xff0c;完成纹理的渲染&#xff0c; 渲染完成后将渲…

界面控件DevExpress中文教程:如何PDF图形对象的可见性?

DevExpress拥有.NET开发需要的所有平台控件&#xff0c;包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具。屡获大奖的软件开发平台DevExpress 近期重要版本v24.1已正式发布&#xff0c;该版本拥有众多新产…

STM32与ESP8266的使用

串口透传 “透传”通常指的是数据的透明传输&#xff0c;意思是在不对数据进行任何处理或修改的情况下&#xff0c;将数据从一个接口转发到另一个接口。值得注意的是要避免串口之间无限制的透明&#xff0c;可以采用互斥锁的方式进行限制使用方法 对USART1和USART3(用他俩举例…

word文档无损原样转pdf在windows平台使用python调用win32com使用pip安装pywin32

前提&#xff1a; windows环境下&#xff0c;并且安装了office套装&#xff0c;比如word,如果需要调用excel.也需要安装。在另外的文章会介绍。这种是直接调用word的。所以还原度会比较高。 需求&#xff1a; word文档转pdf,要求使用命令行形式&#xff0c;最终发布为api接口…

基于高通主板的ARM架构服务器

一、ARM架构服务器的崛起 &#xff08;一&#xff09;市场需求推动 消费市场寒冬&#xff0c;全球消费电子需求下行&#xff0c;服务器成半导体核心动力之一。Arm 加速布局服务器领域&#xff0c;如 9 月推出 Neoverse V2。长久以来&#xff0c;x86 架构主导服务器市场&#…

QTreeView模糊查询

本文代码效果如下&#xff1a; 本文代码&#xff1a; https://download.csdn.net/download/Sakuya__/89759410https://download.csdn.net/download/Sakuya__/89759410 代码之路 MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #incl…

基于Ant-Design-Vue设计的配置化表单

适用vue 3.4 版本以上 在日常的前端开发中&#xff0c;表单开发必不可少&#xff0c;尤其是在遇到一些大型的复杂的表单&#xff0c;这往往会变成一个痛点。于是就想着开发一个可以list来配置的表单组件。 先上组件代码 <!-- 该组件 VUE 版本在 3.4 以上可使用--> <…

【QT】定时器使用

文章目录 关于 Qt 定时器使用的注意细节总结实例-检查工具使用周期时间是否合理UI设计头文件 remind.h源文件 remind.cpp实现效果 关于 Qt 定时器使用的注意细节总结 一、创建与初始化 使用 QTimer 类来创建定时器。可以在构造函数中指定父对象&#xff0c;确保定时器在正确的…

JavaDS —— B树

前言 本章节将带领大家进入B树的学习&#xff0c;主要介绍B树的概念和B树的插入代码的实现&#xff0c;删除代码不做讲解&#xff0c;最后简单介绍B树和B*树。 B树的概念 1970年&#xff0c;R.Bayer和E.mccreight提出了一种适合外查找的树&#xff0c;它是一种平衡的多叉树&…

【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资

最终效果 文章目录 最终效果一、实现Windows消息弹窗二、将窗口扩展到工作区三、穿透能点击到其他区域四、模型交互1、我们可以新增ObjectDrag 代码控制人物拖拖动2、实现模型交互五、最终代码六、其他七、游玩地址七、源码参考完结一、实现Windows消息弹窗 参考:https://lear…

WEB打点

目录 web打点概述打点流程打点中的问题getshell手法汇总web打点批量检测端口扫描POC扫描指纹识别漏洞扫描 手工检测开源框架漏洞通用框架漏洞基础web漏洞商用系统漏洞 WAF绕过waf分类常见waf拦截界面WAF绕过思路侧面绕&#xff1a;适合云WAF直面WAF web打点概述 打点流程 资产…

QT模型视图结构2

文章目录 Qt 模型视图结构——模型类(二)1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色 Qt 模型视图结构——模型类(二) ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模型存储数据&#xff0c;视图组件显示模型中的数据&#…