Java中的Service

七. Service

1. 数据与逻辑分离

之前我们讲面向对象设计,都是把数据和逻辑放在一起,这是理想情况。

现实情况是,把对象分为两类,一类专门存数据,一类专门执行逻辑

存数据的就是一个 Java Bean

存逻辑的叫做 XxxService

2. 控制反转

一直以来,都是我们自己用 new 关键字配合构造方法来创建对象,但我们现在用的是 Spring 框架,可以把一些创建对象的活交给 Spring 框架去做。

那么 Spring 框架怎么创建对象呢?它主要是配合一些注解来完成对象的创建,例如,我们一直在用的 @Controller 注解,当 Spring 程序运行时,它会检查这些类上有没有加一些特殊注解,例如它发现这个类上加了 @Controller 注解,框架就知道,该由框架来创建这个 CalculatorController 对象,默认只会创建一个。

这样的注解还有不少,我们现在需要掌握的有 @Controller 算一个,还有一个是 @Service,试试把这些 Service 类的创建交给 Spring 吧:

@Service
class CalculatorService0 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}@Service
class CalculatorService1 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}@Service
class CalculatorService2 implements Cal {public String[] cal(Calculator c) {}public String[][] details(Calculator c) {}
}
  • @Service 的作用就是告诉 Spring,这个类以后要创建对象的话,不归程序员管了啊,归 Spring 管
  • 其实 @Controller 的作用也是类似的,控制器对象虽然我们没 new,实际由 Spring 来创建了

把对象的创建权交给 Spring 来完成,对象的创建权被交出去,这称之为控制反转

3. 依赖注入

那么我们的代码里怎么拿到 Spring 创建的对象呢?

@Controller
public class CalController {// ...@Autowiredprivate Cal[] calArray;// ...}

这儿又要引入一个相关的名词:依赖注入

比如说,这里的 控制器 需要 service 才能工作,就可以说控制器对象依赖于 service 对象,缺了这些依赖对象行吗?不行吧。怎么找到这些依赖对象呢?如果是框架帮你找到这些依赖对象,按一定规则提供给你,就称之为依赖注入

怎么让框架帮你找到这些依赖对象呢?答案是 @Autowired

«interface»
CalculatorService
CalculatorService0
CalculatorService1
CalculatorService2

在 Cal[] 数组上添加 @Autowired 即可,它是根据类型去问 Spring 要对象,Spring 中有很多对象,具体要哪个对象呢?答案是根据类型

  • Cal 表示,只要 Spring 创建的对象实现了 Cal 接口,就符合条件
  • Cal[] 表示,要多个
  • 最终的结果是找到 Spring 管理的 CalculatorService0、CalculatorService1、CalculatorService2 三个对象,并放入了 Cal[] 数组

4. 由Spring创建JavaBean

Spring 还可以根据请求中的多个查询参数,帮我们创建 JavaBean 数据对象

@Controller
public class CalController {// ...@Autowiredprivate Cal[] calArray;@RequestMapping("/cal")@ResponseBodyString[] cal(Calculator c, int type) {return calArray[type].cal(c);}@RequestMapping("/details")@ResponseBodyString[][] details(Calculator c, int type) {return calArray[type].details(c);}}
  • 如果提供了无参构造,Spring 会优先用它来创建对象,并调用 setXXX 方法,对属性进行赋值
    • 查询参数有 p,那么 Spring 会找一个名为 setP 的方法完成赋值
    • 查询参数有 m,那么 Spring 会找一个名为 setM 的方法完成赋值
    • 查询参数有 yr,那么 Spring 会找一个名为 setYr 的方法完成赋值
    • 查询参数有 type,但 Calculator 对象没有 setType 方法,所以 type 并不会存入对象
  • 如果没有无参构造,但提供了有参构造,Spring 会拿构造方法参数名与查询参数相对应,并完成赋值
    • 我们的例子中,查询参数有 p,m,yr,构造方法参数名也叫 p,m,yr,根据对应关系完成赋值

注意

  • 不是所有 JavaBean 对象都应该交给 Spring 创建,一般只有请求中的数据,才会这么做

5. 包结构约定

目前可以划分 3 个包

  • controller 包,用来存放控制器类
  • service 包,用来存放业务逻辑类
  • dto 包,用来存放存数据的 JavaBean 类,dto 是 Data Transfer Object(数据传输对象)的缩写

最后要注意一下入口类的位置,必须放在 service, controller 这几个包的上一层,为什么呢?

这个入口类,它还肩负了一个职责,查找 @Service, @Controller 等注解的类,然后创建对象。它查找的范围是在这个类的当前 package 之内,因此如果 service,controller 等包如果不在这个 package 内,那么会查找不到

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

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

相关文章

CentOS 7安装Mysql+Mycat

安装MySQL yum源 yum localinstall http://repo.mysql.com//mysql57-community-release-el7-7.noarch.rpm修改源 vi /etc/yum.repos.d/mysql-community.repo [mysql-connectors-community] nameMySQL Connectors Community baseurlhttp://repo.mysql.com/yum/mysql-connectors…

qml中访问控件内部的子项

如何访问Repeater类型内部的子项、Row等布局类型内部的子项以及ListView内部的子项等。。。 1、测试代码 import QtQuick 2.0 import QtQuick.Controls 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.3 import QtQml 2.12Window {id: windowobjectName: "m…

vue-drag-resize-rotate 拖拉拽旋转

中文在线演示地址 1.安装 npm install gausszhou/vue-drag-resize-rotate 2.使用 <template><div class"container"><vue-drag-resize-rotate:w"200":h"200":x"0":y"0":parent"true":draggab…

数据库四种隔离级别

未提交读&#xff08;脏读&#xff09;ru&#xff0c;在事务b中执行了某些操作&#xff0c;比如添加或者修改&#xff0c;这时候事务a可以读取到事务b这个事务还没提交之前的这些操作的结果&#xff0c;其结果被称为脏读。提交读 rc&#xff0c;事务b执行了一些操作并提交&…

基于Python Django的大数据招聘数据分析系统,包括数据大屏和后台管理

基于Python Django的大数据招聘数据分析系统是一个综合利用大数据技术和数据可视化技术的招聘行业解决方案。该系统旨在帮助企业和招聘机构更好地理解和分析招聘市场的趋势和变化&#xff0c;从而提高招聘效率和质量。 首先&#xff0c;该系统提供了一个强大的后台管理功能&am…

Docker容器引擎(3)

目录 一.Docker 镜像的创建 1&#xff0e;基于现有镜像创建 2&#xff0e;基于本地模板创建 3.基于Dockerfile创建&#xff1a; Dockerfile 操作常用的指令&#xff1a; ADD 和 COPY 的区别&#xff1f; CMD 和 ENTRYPOINT 的区别&#xff1f; 容器启动命令的优先级 如…

CF1362C Johnny and Another Rating Drop(二进制、复杂度考虑)

看完数据范围 n ∈ [ 1 , 1 e 18 ] n\in[1,1e18] n∈[1,1e18]就可以先猜一下要不是可以直接推公式&#xff0c;不能暴力去做&#xff0c;更不能遍历一遍&#xff0c;又看到这种2进制的题目&#xff0c;要猜是不是 l o g log log级别的复杂度。 可以依次考虑每一位 所有 i % 2 …

前端vue集成echarts图形报表样例

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f415;1.在项目终端下载echarts依赖包&#x1f3e8;2.在main.js中导入echarts资源包并使用&#x1f380;3.在.vue文件中直接使用echarts&#xff0c;下面是一个样例&a…

[设计模式Java实现附plantuml源码~创建型] 产品族的创建——抽象工厂模式

前言&#xff1a; 为什么之前写过Golang 版的设计模式&#xff0c;还在重新写Java 版&#xff1f; 答&#xff1a;因为对于我而言&#xff0c;当然也希望对正在学习的大伙有帮助。Java作为一门纯面向对象的语言&#xff0c;更适合用于学习设计模式。 为什么类图要附上uml 因为很…

Nginx反向代理配置模块详解

Nginx反向代理配置模块详解 一、前言 随着互联网的发展&#xff0c;Web 应用越来越广泛&#xff0c;随之而来的是对 Web 服务器的高并发、高可用、高性能等需求的日益增长。Nginx 作为一个高性能的 HTTP 和反向代理服务器&#xff0c;由于其出色的性能和稳定性&#xff0c;越…

C语言-算法-线性dp

[USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右下方的点。 在上面的样例中&#xff0c;从 7 → 3 → 8 →…

配置ansible自动化工具

自动化运维工具 Puppet : 用ruby语言写的 Saltstack : 用python写的,是一个模块化shell(就是命令),用的agent服务连接的被控端,用于大集群,高并发 ansible : 用python写的,也是模块化shell(就是命令),部署简单,不需要启动和安装agent等服务,用的ssh连接被控端,用于小集…

yolov8上使用gpu教程

yolov8上使用gpu教程 安装Cuda和Cudnnyolov8上使用gpu 安装Cuda和Cudnn 1.查看支持的cuda版本&#xff0c;并去官网下载。 nvidia-smi2.网址&#xff1a;https://developer.nvidia.com/cuda-toolkit-archive 3.安装细节 安装的前提基础是&#xff0c;有vs的C环境。我电脑有…

开始学习Vue2(组件的生命周期和数据共享)

一、组件的生命周期 1. 生命周期 & 生命周期函数 生命周期&#xff08;Life Cycle&#xff09;是指一个组件从创建 -> 运行 -> 销毁的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数&#xff1a;是由 vue 框架提供的内置函数&#xff0c;会伴随着 组件…

Java算法 leetcode简单刷题记录3

Java算法 leetcode简单刷题记录3 汇总区间&#xff1a; https://leetcode.cn/problems/summary-ranges/ 把数据按照是否连续分组输出 主要是 n<nums.length-1 && nums[n]1nums[n] 最多可以摧毁的敌人城堡&#xff1a; https://leetcode.cn/problems/maximum-enemy-…

必知的量化交易基础

量化交易核心概念 量化思想 量化交易 量化交易是指以先进的数学模型代替人为的主观判断&#xff0c;利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略&#xff0c;极大地减少了投资者情绪波动的影响&#xff0c;避免在市场极度狂热或悲观的…

对Git更深入了解与学习

对Git更深入了解与学习 0. 前言0.1 工作区与暂存区 1. git remote update origin2. git push origin --delete 分支名 删除远端分支3. git remote4. git fetch5. git status5.1 git status 直观理解5.2 暂存与暂存取消 &#xff08;git restore&#xff09;5.3 push之后 6. git…

网络与IO

netty https://www.cnblogs.com/nanaheidebk/p/11025362.html netty基础知识_netty和websocket区别-CSDN博客 Netty核心概念、架构及用法 - 知乎&#xff08;有图好理解&#xff09; IO java之NIO简介_nio java-CSDN博客 io、nio、tcp协议、socket、websocket、netty、to…

MySQL如何处理约束

MySQL允许您同时使用支持回滚的事务表和不支持回滚的非事务表。因此&#xff0c;MySQL中的约束处理与其他数据库管理系统有所不同。当在非事务表中插入或更新了大量行时&#xff0c;并且在发生错误时无法回滚更改时&#xff0c;我们必须处理这种情况。 基本理念是&#xff0c;…

SpringBootAdmin邮件通知

在上一篇中我们学习到了 Admin Service Clustering 分布式缓存配置 &#xff0c;这一篇我们来学习&#xff0c;客户端离线&#xff0c;出现故障的时候&#xff0c;我们这么能及时知道呢&#xff0c;发现邮件通知也许是最简单的方式了&#xff01; 邮件通知 邮件通知将作为使用…