Java后端框架---Spring

news2024/11/24 9:44:44

目录

一.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.coloradmin.cn/o/2140731.html

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

相关文章

双三次插值及MATLAB实现

一、双三次插值的概念 双三次插值&#xff08;Bicubic interpolation&#xff09;&#xff0c;又叫双立方插值。在数值分析这个数学分支中&#xff0c;双三次插值是二维空间中最常用的插值方法。在这种方法中&#xff0c;函数f在点 (x0 ,y0) 的值不仅考虑其直接邻接点对其的影响…

MySQL —— 索引

索引的概念 MySQL的索引是⼀种数据结构&#xff0c;它可以帮助数据库高效地查询、更新数据表中的数据。索引通过 ⼀定的规则排列数据表中的记录&#xff0c;使得对表的查询可以通过对索引的搜索来加快速度。 MySQL索引类似于书籍的目录&#xff0c;通过指向数据行的位置&…

Flutter Error: Type ‘UnmodifiableUint8ListView‘ not found

问题描述 原本我在Mac开发的项目&#xff0c;现在win10运行时报如下错误&#xff1a; ../../../AppData/Local/Pub/Cache/hosted/pub.dev/win32-3.1.4/lib/src/guid.dart:31:9: Error: Type UnmodifiableUint8ListView not found. final UnmodifiableUint8ListView bytes; ^^…

C# 异步编程场景

前言 异步编程允许程序在等待某些操作&#xff08;如文件读写、网络请求等&#xff09;完成时&#xff0c;不必阻塞主线程&#xff0c;从而可以继续执行其他任务。这种非阻塞的特性对于提高应用程序的并发性和响应速度至关重要。C# 通过 async 和 await 关键字&#xff0c;以及…

hh exe所选的程序不能与此文件类型相关联。请选择其他程序。

按照hh exe打开chm文件显示所选的程序不能与此文件类型相关联。请选择其他程序。 以上错误来自于 cmd命令行 cd C:\Windows\hh.exe 要打开的chm文件报错 其实根本原因是在设置中.chm文件默认打开方法被其他软件占用了&#xff0c;解决办法只能删除那个软件&#xff0c;如果是W…

828华为云征文 | 云服务器Flexus X实例:部署 AgentOps,全方位监测智能体

目录 一、什么是 AgentOps ? 二、部署 AgentOps 2.1 安装 AgentOps 2.2 注册账号 2.3 生成 API_KEY 三、AgentOps 实例 3.1 创建实例 3.2 运行实例 四、总结 通过深入体验华为云的 Flexus云服务器X实例&#xff0c;我发现它不仅提供了直接通过公网访问的便利性&#…

【 html+css 绚丽Loading 】 000049 流云穿梭环

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f…

回归预测|基于遗传优化卷积神经网络的数据回归预测Matlab程序GA-CNN 多特征输入单输出 附赠基础CNN

回归预测|基于遗传优化卷积神经网络的数据回归预测Matlab程序GA-CNN 多特征输入单输出 附赠基础CNN 文章目录 一、基本原理1. 卷积神经网络&#xff08;CNN&#xff09;2. 遗传算法&#xff08;GA&#xff09;3. GA-CNN回归预测模型总结 二、实验结果三、核心代码四、代码获取五…

智能BI项目第一期

该项目是全程跟着鱼皮,还未进行功能扩展。为了方便日后复习,打算将一些重要的步骤记录下来。 项目概述 BI:即商业智能:Business Intelligence 过去 需要手动导入数据、选择要分析的字段和图表&#xff0c;并由专业的数据分析师完成分析&#xff0c;最后得出结论。 现在 用户…

docker发布redis容器

1.导入redis镜像 2.写docker-compose文件 并创建容器 redis:container_name: redisimage: redis:latestports:- "6379:6379"restart: always 3.测试一下

“深入解析:MySQL半同步复制的配置指南与实践技巧“

本次配置是在已搭建好主从复制的架构中进行配置 配置环境 操作系统 master节点 slave节点 centos7 8.0.37 8.0.37 配置半同步复制 配置master 安装master半同步复制插件 INSTALL PLUGIN rpl_semi_sync_source SONAME semisync_source.so; 在MySQL的配置文件中添加配置…

论文(六):Fire-Net: A Deep Learning Framework for Active Forest Fire Detection

文章目录 1.Introduction2.Study Area2.1Landsat-8 Dataset2.2Inventory data 3.Methodology3.1Image Pre-processing3.2Proposed Deep Learning Architecture (Fire-Net)3.2.1Convolution Layers3.2.2 Evaluation Indices/methods or accuracy assessment. 4.Results4.1 Austr…

JVM HotSpot 虚拟机: 对象的创建, 内存布局和访问定位

目录 前言 对象的创建 对象的内存布局 对象的访问定位 前言 了解JVM的内存区域划分之后, 也大致了解了java程序的内存分布模型, 也了解它里面的内存区域里面的类型和各个类型的作用, 接下来我们进一步从对象创建到访问的角度, 来看看这些内存区域之间是怎么关联起来的. …

【C++篇】C++类与对象深度解析(二):类的默认成员函数详解

文章目录 【C篇】C类与对象深度解析&#xff08;二&#xff09;前言1. 类的默认成员函数2. 构造函数2.1 函数名与类名相同2.2 无返回值2.3 对象实例化时系统会自动调用2.4 构造函数可以重载2.5 默认构造函数的生成规则2.6 无参构造函数与全缺省构造函数的关系2.7 内置类型与自定…

五、(JS)window中的定时器

一、为什么叫做window中的定时器 我们在全局中会用到一些函数&#xff0c;比如说alert函数&#xff0c;prompt函数&#xff0c;setTimeout等等 我们有在这里定义过这些函数吗&#xff1f;很明显没有。可见我们这些函数都是来自于window。 所以还可以写成window.setTimeout。…

Linux 开发工具(vim、gcc/g++、make/Makefile)+【小程序:进度条】-- 详解

目录 一、Linux软件包管理器 - yum&#xff08;ubuntu用apt代替yum&#xff09;1、Linux下安装软件的方式2、认识 yum3、查找软件包4、安装软件5、如何实现本地机器和云服务器之间的文件互传 二、Linux编辑器 - vim1、vim 的基本概念2、vim 下各模式的切换3、vim 命令模式各命令…

【Linux篇】TCP/IP协议(笔记)

目录 一、TCP/IP协议族体系结构 1. 数据链路层 &#xff08;1&#xff09;介绍 &#xff08;2&#xff09;常用协议 ① ARP协议&#xff08;Address Resolve Protocol&#xff0c;地址解析协议&#xff09; ② RARP协议&#xff08;Reverse Address Resolve Protocol&…

[Meachines] [Easy] Sauna DC域+AS-REP+TGT票证窃取+AutoLogon凭据+DCSync攻击

信息收集 IP AddressOpening Ports10.10.10.175TCP:53,80,88,135,139,389,445,464,593,3268,3269,5985 $ nmap -p- 10.10.10.175 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 53/tcp open domain? | fingerprint-strings: | DNSVersionBindReqTCP…

电容的不同材质对应的温度范围

电容的温度范围是指电容在不同温度下能够正常工作的范围。不同材质的电容具有不同的温度特性&#xff0c;以下是一些常见电容材质的温度范围。 C0G/NP0&#xff1a;这类电容具有非常稳定的电气性能&#xff0c;工作温度范围通常为-55℃至125℃。 X7R&#xff1a;X7R材质的电容…