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.mzph.cn/bicheng/54431.shtml

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

相关文章

【踩坑】装了显卡,如何让显示器从主板和显卡HDMI都输出

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 背景介绍 装了显卡后&#xff0c;开机默认是从显卡的HDMI输出&#xff0c;但这很不方便。如何让视频仍然从主板输出&#xff1f;或者说让显卡HDMI和主板…

系统 IO

"裸奔"层次&#xff1a;不带操作系统的编程 APP(应用程序) -------------------------------- Hardware(硬件) 特点&#xff1a;简单&#xff0c;应用程序直接操作硬件(寄存器) 缺点&#xff1a; 1. 搞应用开发的必须要了解硬件的实现细节&#xff0c;能够看懂原理图…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

【笔记】2.1 半导体三极管(BJT,Bipolar Junction Transistor)

一、结构和符号 1. 三极管结构 常用的三极管的结构有硅平面管和锗合金管两种类型。各有PNP型和NPN型两种结构。 左图是NPN型硅平面三极管,右图是PNP型锗合金三极管。 从图中可见平面型三极管是先在一块大的金属板上注入杂质使之变成N型,然后再在中间注入杂质使之变成P型,…

Note091203_Outlook邮件撤回操作

Note091203_Outlook邮件撤回操作 如图所示&#xff1a; step1: 打开outlook step2&#xff1a; 点击已发送邮件&#xff0c;选中目标撤回邮件双击打开&#xff1b; step3&#xff1a; 点击图中2框所示&#xff0c;可看见撤回操作&#xff1b; 以上

Linux操作系统 进程(3)

接上文 Linux进程优先级之后&#xff0c;我们了解到僵尸进程与孤儿进程的形成原因&#xff0c;既然是因为父进程没有接收子进程的退出状态导致的&#xff0c;那么我们该如何去获取子进程的退出状态呢&#xff1f;那本篇文章将围绕这个问题来解释进程。 环境 &#xff1a; vsco…

基于CNN的10种物体识别项目

一&#xff1a;数据导入和处理 1.导入相关包&#xff1a; import numpy as np import pandas as pd import matplotlib.pyplot as plt import tensorflow as tf2.下载数据 (x_train_all, y_train_all), (x_test, y_test) tf.keras.datasets.cifar10.load_data()# x_valid:测…

【Qt笔记】QTabWidget控件详解

目录 引言 一、基本功能 二、核心属性 2.1 标签页管理 2.2 标签位置 2.3 标签形状 2.4 标签可关闭性 2.5 标签可移动性 三、信号与槽 四、高级功能 4.1 动态添加和删除标签页 4.2 自定义标签页的关闭按钮行为 4.3 标签页的上下文菜单 五、样式设置 六、应用示例…

快速使用react 全局状态管理工具--redux

redux Redux 是 JavaScript 应用中管理应用状态的工具&#xff0c;特别适用于复杂的、需要共享状态的中大型应用。Redux 的核心思想是将应用的所有状态存储在一个单一的、不可变的状态树&#xff08;state tree&#xff09;中&#xff0c;状态只能通过触发特定的 action 来更新…

硬件基础知识

驱动开发分为&#xff1a;裸机驱动、linux驱动 嵌入式&#xff1a;以计算机技术为基础&#xff0c;软硬结合的、可移植、可剪裁的专用计算机 单片机最小单元&#xff1a;vcc gnd reset 晶振 cpu --- soc :system on chip 片上外设 所有的程序都是在soc&#xff08;cpu&…

【Android安全】Ubuntu 16.04安装GDB和GEF

1. 安装GDB sudo apt install gdb-multiarch 2. 安装GEF(GDB Enhanced Features) 官网地址&#xff1a;https://github.com/hugsy/gef 2.1 安装2021.10版本 但是在Ubuntu 16.04上&#xff0c;bash -c "$(curl -fsSL https://gef.blah.cat/sh)"等命令不好使&…

深度学习自编码器 - 收缩自编码器(CAE)篇

序言 在深度学习的浪潮中&#xff0c;收缩自编码器&#xff08; Compressive Autoencoder, CAE \text{Compressive Autoencoder, CAE} Compressive Autoencoder, CAE&#xff09;作为自编码器的一种高级形式&#xff0c;正逐步崭露头角。收缩自编码器在保留自编码器核心功能—…

【贪心算法】贪心算法一

贪心算法一 1.柠檬水找零2.将数组和减半的最少操作次数3.最大数4.摆动序列 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.柠檬水找零 题目…

【安当产品应用案例100集】017-助力软件服务商高效集成多因素认证

一、企业案例背景 在本案例中&#xff0c;某企业作为一家软件技术服务商&#xff0c;为包括银行、政府机构在内的多个行业提供定制化的软件服务。由于各个行业的安全需求各异&#xff0c;例如银行和政府机构倾向于使用UKEY进行身份验证&#xff0c;而其他企业则可能偏好使用数…

创建Django 项目

创建一个新的 Django 项目&#xff1a; django-admin startproject myproject cd myproject 在 Django 项目中创建一个新的应用&#xff1a; python manage.py startapp myapp设置数据库 编辑 myproject/settings.py 文件中的数据库设置&#xff1a; DATABASES {default:…

OJ在线评测系统 前端开发设计优化通用菜单组件二 调试用户自动登录

通用的菜单组件开发二 接下来要完善 权限功能 就是只有登录后才能进入题目查看界面 用户只能看到我们有权限的菜单 我们要在路由文件里面去操作 原理是控制路由设置隐藏 只要用户没有权限 就过滤掉隐藏 全局权限管理 实现想清楚有那些权限 /*** 权限定义*/ const ACCES…

2017年国赛高教杯数学建模A题CT系统参数标定及成像解题全过程文档及程序

2017年国赛高教杯数学建模 A题 CT系统参数标定及成像 CT(Computed Tomography)可以在不破坏样品的情况下&#xff0c;利用样品对射线能量的吸收特性对生物组织和工程材料的样品进行断层成像&#xff0c;由此获取样品内部的结构信息。一种典型的二维CT系统如图1所示&#xff0c…

瑞芯微RK3588开发板Linux系统添加自启动命令的方法,深圳触觉智能Arm嵌入式鸿蒙硬件方案商

本文适用于触觉智能所有Linux系统的开发板、主板添加自启动命令的方法&#xff0c;本次使用了触觉智能的EVB3588开发板演示&#xff0c;搭载了瑞芯微RK3588旗舰芯片。 该开发板为核心板加底板设计&#xff0c;为工业场景设计研发的模块化产品&#xff0c;10年以上稳定供货,帮助…

U盘显示未被格式化:深度解析与数据恢复指南

一、现象解析&#xff1a;U盘显示未被格式化之谜 在日常使用U盘的过程中&#xff0c;不少用户可能会遭遇一个令人头疼的问题——插入U盘后&#xff0c;系统提示“U盘未被格式化”&#xff0c;要求用户进行格式化操作以继续访问。这一突如其来的提示不仅打断了正常的工作流程&a…

Java 数据类型转换详解:隐式转换(自动转换)与强制转换(手动转换)

目录 前言 取值范围从小到大的关系&#xff1a; 隐式转换&#xff08;自动转换&#xff09; &#x1f4dc;示例 1&#xff1a;基本类型隐式转换 &#x1f4dc;示例 2&#xff1a;算术运算中的类型提升 &#x1f4dc;示例 3&#xff1a;byte、short 和 char 的自动转换 隐…