Maven+Spring实现后端开发

一、前置知识的介绍

1.Spring

轻量级的 DI / IoC 和 AOP 容器的开源框架

容器的开源框架网址:https://spring.io/projects/spring-framework

作用:可简化管理创建和组装对象之间的依赖关系

将controller----->service------->dao层的依赖配置使用Spring注解来实现自动注入。

2.Spring IOC

Inverse of Control(控制反转)是一种设计思想 将程序中手动创建对象的流程,交由Spring框架来管理,即把创建对象的控制权反转给Spring框架,由Spring统一管理。把spring ioc 当成一个容器,里面存储管理的对象称为Bean

3.DI

Dependency Injection ,依赖注入,动态地将对象某种依赖关系注入到对象之中.

4.Bean属性scope

singleton:单例, 默认值,调用getBean方法返回是同一个对象,spring的IOC容器中只会存在一个该bean。

prototype: 多例,调用getBean方法创建不同的对象,会频繁的创建和销毁对象造成很大的开销。

5.AOP

Aspect Oriented Program 面向切面编程,在不改变原有逻辑上增加额外的功能。

把功能分两个部分,核心关注点(业务的主要功能)与横切关注点(非核心、额外增加的功能)

通知 Advice:在特定的切入点上执行的增强处理;类型包括@Before前置通知-在执行目标方法之前运行,@After后置通知、@AfterReturning返回通知-在目标方法正常返回值后运行、@AfterThrowing异常通知-在目标方法出现异常后运行、@Around环绕通知-在目标方法完成前、后做增强处理 。

连接点 JointPoint:业务流程在运行过程中需要插入切面的具体位置

切入点 Pointcut:通过特定的规则来筛选连接点, 就是Pointcut,选中那几个你想要的方法

切面 Aspect:定义了切入点+通知的一个类 。

目标 target:目标类,真正的业务逻辑。

织入 Weaving:把切面(某个类)应用到目标函数的过程称为织入。

AOP代理:对AOP框架创建对象的加强,主要有JDK动态代理与CGLIB代理

//目标类 VideoOrderService; 里面每个方法都是连接点(addOrder,findOrderById,delOrder,updateOder);

//切入点是CUD类型的方法,R读取的不作为切入点 ,CRDU全称:增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)

//目标类

VideoOrderService{

//新增订单

addOrder(){ }

//查询订单

findOrderById(){}

//删除订单

delOrder(){}

//更新订单

updateOrder(){} }

//权限切面类 = 切入点+通知

PermissionAspects{

//切入点 定义了什么地方

@Pointcut("execution(public int net.xdclass.sp.service.VideoOrderService.*(..))")

public void pointCut(){}

//before 通知 表示在目标方法执行前切入, 并指定在哪个方法前切入

//什么时候,做什么事情

@Before("pointCut()") public void permissionCheck(){

System.out.println("在 xxx 之前执行权限校验"); } .... }

//日志切面类 = 切入点+通知 LogAspect{

//切入点 定义了什么地方 @Pointcut("execution(public int net.xdclass.sp.service.VideoOrderService.*(..))")

public void pointCut(){}

//after 通知 表示在目标方法执行后切入, 并指定在哪个方法前切入

//什么时候,做什么事情

@After("pointCut()") public void logStart(){

System.out.println("在 xxx 之后记录日志"); } .... }


6.切入点表达式

格式

execution(访问修饰符 返回值类型 包和类 方法

7.代理

创建代理对象来控制对原对象,通过代理类这中间一层,能有效控制对委托类对象的直接访问

静态代理-由程序创建或特定工具自动生成源代码;

动态代理-在程序运行时,运用反射机制动态创建而成,主要有JDK动态代理与CGLIB代理。 

二、搭建项目

1.快速上手搭建

创建maven项目

添加maven依赖可参照网站:https://mvnrepository.com/

在pom.xml中添加依赖

  <!-- https://mvnrepository.com/artifact/org.springframework/spring-context --><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.2.5.RELEASE</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>5.2.5.RELEASE</version></dependency>

开发实体层(domain)

package net.xdclass.sp.domain;public class Video {private int id;private String title;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}
}

创建配置文件

applicationContext.xml:添加bean配置

<?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/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="video" class="net.xdclass.sp.domain.Video" scope="prototype"><property name="name" value="tom"/><property name="id" value="23"/></bean></beans>

开发启动类

获取bean,调用对象中的方法

package net.xdclass.sp;import net.xdclass.sp.domain.Video;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App {public static void main(String [] args){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");Video  video = (Video)applicationContext.getBean("video");System.out.println(video.getTitle());}}

三、spring的使用介绍

1.使用xml配置 

Bean对象的常见注入方式

作用范围通过scope来指定,singleton-单例, 默认值;prototype:-多例

使用set方法注入

<bean id="video" class="net.xdclass.sp.domain.Video" scope="singleton"><property name="id" value="9"/><property name="title" value="Spring 5.X课程" /></bean>

使用带参的构造函数注入

<bean id="video" class="net.xdclass.sp.domain.Video" ><constructor-arg name="title" value="面试专题课程第一季"></constructor-arg></bean>

POJO类型注入(property 没有使用value属性,而是使用了ref属性)

<bean id="video" class="net.xdclass.sp.domain.Video" ><constructor-arg name="title" value="面试专题课程第一季"></constructor-arg></bean><bean id="videoOrder" class="net.xdclass.sp.domain.VideoOrder" ><property name="id" value="8" /><property name="outTradeNo" value="23432fnfwedwefqwef2"/><property name="video" ref="video"/></bean>

 list类型与Map类型的注入

<bean id="video" class="net.xdclass.sp.domain.Video" ><!--list类型注入--><property name="chapterList"><list><value>第一章SpringBoot</value><value>第二章Mybatis</value><value>第三章Spring</value></list></property><property name="videoMap"><map><entry key="1" value="SpringCloud课程"></entry><entry key="2" value="面试课程"></entry><entry key="3" value="javaweb课程"></entry></map></property>
</bean>

在实体类中添加返回方法

public class Video {private int id;private String title;private List<String> chapterList;private Map<Integer,String> videoMap;//省略set get方法
}

优化配置

两个类之间大多数的属性都相同,可通过parent标签来避免重复配置

<bean id="video" class="net.xdclass.sp.domain.Video" scope="singleton"><property name="id" value="9"/><property name="title" value="Spring 5.X课程" /></bean><bean id="video2" class="net.xdclass.sp.domain.Video2" scope="singleton" parent="video"><!--只需要配置不同的属性即可--><property name="summary" value="这个是summary"></property></bean>

 两个类之间存在属性依赖,可通过depend-on实现实例化的顺序

<bean id="video" class="net.xdclass.sp.domain.Video" scope="singleton"><property name="id" value="9"/><property name="title" value="Spring 5.X课程" /></bean><!--设置两个bean的关系,video要先于videoOrder实例化--><bean id="videoOrder" class="net.xdclass.sp.domain.VideoOrder" depends-on="video"><property name="id" value="8" /><property name="outTradeNo" value="23432fnfwedwefqwef2"/><property name="video" ref="video"/>
</bean>

Bean生命周期

通过init-method与destroy-method来指定

<bean id="video" class="net.xdclass.sp.domain.Video" scope="singleton" init-method="init" destroy-method="destroy">

自动装配属性autowire

可为一个 bean 定义指定自动装配模式,可设置的值有no-不开启、byName-据id注入对应属性、byType-据类型注入属性、constructor-据构造函数注入属性。

<bean id="videoOrder" class="net.xdclass.sp.domain.VideoOrder" autowire="byName">

 2.使用注解配置

开启注解的配置

package net.xdclass.sp;import net.xdclass.sp.aop.AnnotationAppConfig;
import net.xdclass.sp.domain.Video;
import net.xdclass.sp.domain.VideoOrder;
import net.xdclass.sp.service.VideoService;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class App {public static void main(String[] args) {//1.加载注解配置类AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AnnotationAppConfig.class);//2.通过@Component获取beanVideoService videoService = (VideoService) context.getBean("videoService");//3.调用Bean对象的业务方法videoService.findById(2);}}
  • 配置Bean对象

通过@Component("Bean对象名") 通用组件 细分: @Controller (用于web层) @Service (用于service层) @Repository (用于dao仓库层)

domain层

package net.xdclass.sp.domain;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Map;@Component
public class Video {private int id;private String title;public void init(){System.out.println("video类 init 方法被调用");}public void destroy(){System.out.println("video类 destroy 方法被调用");}public Video(){//System.out.println("video 空构造函数被调用");}public Video(String title){//System.out.println("video 带参数构造函数被调用");this.title = title;}public int getId() {return id;}public void setId(int id) {//System.out.println("Video setId方法被调用");this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {//System.out.println("Video setTitle方法被调用");this.title = title;}
}

controller层:未指定时,默认为方法名 + 第一个字母小写 作为bean的名称

package net.xdclass.sp.controller;import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;@Controller
public class VideoController {
}

service层

package net.xdclass.sp.service;import net.xdclass.sp.config.CustomConfig;
import net.xdclass.sp.dao.VideoDao;
import net.xdclass.sp.domain.Video;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;//@Component("videoService")
@Service("videoService")
public class VideoServiceImpl implements VideoService {@Autowired//实现Bean对象的注入private VideoDao videoDao;@Autowiredprivate CustomConfig customConfig;public int save(Video video) {System.out.println("保存video");return 1;}public Video findById(int id) {System.out.println("根据id找视频");videoDao.test();System.out.println(customConfig.getHost());try {Thread.sleep(2000L);} catch (InterruptedException e) {e.printStackTrace();}return new Video();}
}

dao层

package net.xdclass.sp.dao;import org.springframework.stereotype.Repository;@Repository("videoDao")
public class VideoDao {public void test(){System.out.println("video Dao test ");}}
  • 注入Bean对象 

类型注入@Autowired;名称注入@Qualifier

bean生命周期

@PostConstruct初始化、@PreDestroy销毁

bean作用范围

@scope注解,singleton-单例, 默认值;prototype:-多例

package net.xdclass.sp.domain;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import java.util.List;
import java.util.Map;@Component
//@Scope("prototype")
@Scope
public class Video {private int id;private String title;@PostConstructpublic void init(){System.out.println("video类 init 方法被调用");}@PreDestroypublic void destroy(){System.out.println("video类 destroy 方法被调用");}}

定义第三方bean

@Configuration标注在类为spring容器(相当于类在spring的xml配置文件中的配置)

@bean标注方法为一个Bean对象,将Bean对象交给Spring管理,Spring将Bean对象放入IOC容器中。

注意:bean都需要在@Configuration注解下进行创建

package net.xdclass.sp.config;import net.xdclass.sp.domain.VideoOrder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;@Configuration
public class AppConfig {//使用@bean注解,表明这个bean交个spring 进行管理// 如果没有指定名称,默认采用 方法名 + 第一个字母小写 作为bean的名称@Bean(name = "videoOrderName",initMethod = "init",destroyMethod = "destroy")@Scopepublic VideoOrder videoOrder(){return new VideoOrder();}}

自动映射配置文件

@PropertySource,指定加载配置文件,实现将配置文件映射到实体类;

@Value映射到具体的java属性

创建配置文件config.properties


server.host=127.0.0.1server.port=999

映射到实体类中

package net.xdclass.sp.config;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;@Configuration//1.指定这个类是一个配置类
@PropertySource(value = {"classpath:config.properties"})//2.指定配置文件
public class CustomConfig {@Value("${server.host}")//3.注入配置文件中的属性值private String host;@Value("${server.port}")private int port;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}
}

 四、事务管理

1.概念

多个操作,要么同时成功,要么失败后一起回滚。包括A(Atomic-原子性)C(Consistency-一致性)I(Isolation-隔离性)D(Durability-持久性)四种特性.

2.方法

beginTransaction()、commit()、rollback()

3.事务传播

在开始当前事务之前,一个事务上下文已经存在,实现指定一个事务性方法的执行行为

4.事务隔离

是指若干个并发的事务之间的隔离程度

五、小结 

       与上一篇MyBatis+Maven开发后端比较, 在MyBatis中配置xml着重在于去存放sql语句,通过调用层层封装的方法来进行操作;而Spring中配置xml着重在于配置Bean对象,通过获取Bean调用其中的方法来进行操作。

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

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

相关文章

解锁界面设计密码,打造极致用户体验

界面设计是对软件、网站、移动应用等产品的用户界面进行设计的过程&#xff0c;旨在为用户提供美观、易用、高效的交互体验。以下是关于界面设计的一些主要方面&#xff1a; 一、设计原则 用户中心原则&#xff1a;以用户为中心&#xff0c;了解用户的需求、期望、行为和习惯…

Joint Receiver Design for Integrated Sensing and Communications

摘要——在本文中&#xff0c;我们研究了集成感知与通信(ISAC)系统的联合接收机设计&#xff0c;其中通信信号和目标回波信号同时被接收和处理&#xff0c;以在两种功能之间实现平衡性能。特别地&#xff0c;我们提出了两种设计方案来解决联合感知和通信问题中的接收信号处理。…

DeepSeek接入飞书多维表格,效率起飞!

今天教大家把DeepSeek接入飞书表格使用。 准备工作&#xff1a;安装并登录飞书&#xff1b;可以准备一些要处理的数据&#xff0c;确保数据格式正确&#xff0c;如 Excel、CSV 等&#xff0c;也可直接存储到飞书多维表格。 创建飞书多维表格&#xff1a;打开飞书&#xff0c;点…

【C语言入门】由浅入深学习指针 【第二期】

目录 1. 指针变量为什么要有类型&#xff1f; 2. 野指针 2.1 未初始化导致的野指针 2.2 指针越界导致的野指针 2.3 如何规避野指针 3. 指针运算 3.1 指针加减整数 3.2 指针减指针 3.3 指针的关系运算 4. 二级指针 5. 指针数组 5.1 如何使用指针数组模拟二维数组 上…

OpenCV 图形API(13)用于执行两个矩阵(或图像)逐元素乘法操作的函数mul()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 计算两个矩阵的每个元素的缩放乘积。 mul函数计算两个矩阵的逐元素乘积&#xff1a; dst ( I ) saturate ( scale ⋅ src1 ( I ) ⋅ src2 ( I ) ) …

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建

人工智能混合编程实践:C++调用封装好的DLL进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**DLL 简介**核心特点****创建与使用****应用场景****优点与挑战**图像异常检测简介应用场景前提条件实验环境项目结构C++调用封装好的DLL进行图像超分重建C…

Linux内核之高效缓冲队列kfifo

一、先说FIFO 队列是常见的一种数据结构&#xff0c;简单看来就是一段数据缓存区&#xff0c;可以存储一定量的数据&#xff0c;先存进来的数据会被先取出&#xff0c;First In Fist Out&#xff0c;就是FIFO。 FIFO主要用于缓冲速度不匹配的通信。 例如生产者&#xff08;数…

【面试篇】Kafka

一、基础概念类 问题&#xff1a;请简述 Kafka 是什么&#xff0c;以及它的主要应用场景有哪些&#xff1f; 答案&#xff1a;Kafka 是一个分布式流处理平台&#xff0c;它以高吞吐量、可持久化、可水平扩展等特性而闻名。其主要应用场景包括&#xff1a; 日志收集&#xff1a…

解释回溯算法,如何应用回溯算法解决组合优化问题?

一、回溯算法核心原理 回溯算法本质是暴力穷举的优化版本&#xff0c;采用"试错剪枝"策略解决问题。其核心流程如下&#xff1a; ​路径构建&#xff1a;记录当前选择路径​选择列表&#xff1a;确定可用候选元素​终止条件&#xff1a;确定递归结束时机​剪枝优化…

Vue 学习随笔系列二十二 —— 表格高度自适应

表格高度自适应 文章目录 表格高度自适应1、方法一2、方法二 1、方法一 根据页面元素计算各自占比 <template><div class"main"><div class"query-form" ref"Query"><QueryFormref"QueryForm"query"query&q…

ubuntu22.04.5安装docker,解决安装出现的错误,解决Docker hello-world没打印出来

文章目录 前言一 安装失败解决1结合具体报错分析2 首先怀疑是VPN的问题3 直接百度报错信息4最终解决问题 二 验证Docker hello-world没打印出来总结 前言 先说一下前面的情况&#xff0c;使用的是公司的工作站&#xff0c;登录公司一个帐号使用的公司网络&#xff0c;使用网上…

idea插件(自用)

.ignore git排除文件插件&#xff1a;.ignore介绍 Grep console 自定义日志颜色&#xff1a;Grep console介绍 AceJump 光标快速定位&#xff1a;AceJump介绍 Key promoter 提示插件:Key promoter介绍 MetricsReloaded 分析代码复杂度的插件&#xff1a;MetricsReload…

让AI再次伟大-MCP-Client开发指南

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理、AI应用&#x1f525;如果感觉…

供应链管理:计算题 / 倒扣法

一、理解倒扣法 在供应链管理中&#xff0c;倒扣法是一种常用的成本计算方法&#xff0c;主要用于确定商品的成本和销售价格&#xff0c;以确保特定的毛利率。倒扣法的基本原理是在已知售价和期望毛利率的情况下&#xff0c;逆推计算出供货价或成本价。 二、倒扣法的计算公式…

skynet.start 的作用详细解析

目录 skynet.start 的作用详细解析1. 功能概述2. 基本用法3. 关键作用(1) 注册消息处理函数(2) 启动事件循环(3) 服务生命周期管理 4. 与其他函数的协作5. 未调用 skynet.start 的后果6. 高级场景&#xff1a;何时不需要 skynet.start7. 总结 skynet.start 的作用详细解析 在 …

基于yolo11的BGA图像目标检测

1.产生图像数据的分辨率 2.产生图像的大小 3.产生图像是黑白或是RGB彩色 灰度图像&#xff0c;达到识别要求&#xff0c;减少计算量 4.标注数据的精准程度 1.模型标注后&#xff0c;少量标注全部人工校验&#xff0c;大量数据抽检&#xff0c;部分人工检验 2.明确边界框贴合…

PADS 9.5【附破解文件+安装教程】中文激活版下载

第1步 将软件安装包下载到电脑本地&#xff0c;使用解压工具进行解压打开&#xff08;全程关闭杀毒软件以及防火墙&#xff0c;避免破解文件被删除&#xff09; 第2步 鼠标右键以管理员身份运行“PADS9.5_mib.exe” 第3步 加载片刻后&#xff0c;弹出如图界面&#xff0c;点击N…

电子电气架构 --- SOC设计流程及其集成开发环境

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 周末洗了一个澡&#xff0c;换了一身衣服&#xff0c;出了门却不知道去哪儿&#xff0c;不知道去找谁&am…

图扑 HT 电缆厂 3D 可视化管控系统深度解析

在当今数字化浪潮席卷制造业的大背景下&#xff0c;图扑软件&#xff08;Hightopo&#xff09;凭借其自主研发的强大技术&#xff0c;为电缆厂打造了一套先进的 3D 可视化管控系统。该系统基于 HT for Web 技术&#xff0c;为电缆厂的数字化转型提供了有力支撑。 HT 技术核心架…