Spring Boot Web开发实践:响应参数的使用方法、IOC、DI和Bean基本介绍

news2024/11/16 2:34:31

主要介绍了SpringBootWeb响应参数的基本使用和spring框架的控制反转(IOC)和依赖注入(DI)以及Bean对象的声明、扫描、注入!!!

目录

前言

响应参数

分层解耦

三层架构

分层解耦 

IOC & DI 入门

Bean的声明

Bean组件扫描

 Bean注入

总结


前言

主要介绍了SpringBootWeb响应参数的基本使用和spring框架的控制反转(IOC)和依赖注入(DI)以及Bean对象的声明、扫描、注入!!!


提示:以下是本篇文章正文内容,下面案例可供参考

响应参数

  • 类型:方法注解、类注解
  • 位置:Controller方法上/类上
  • 作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合 ,将会转换为JSON格式响应
  • 说明:@RestController = @Controller + @ResponseBody ;
package org.example.springbootweb.controller;

import org.example.springbootweb.pojo.Address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

@RestController
public class ResponseController {
    
    @RequestMapping("/hello")
    public String hello(){
        System.out.println("Hello World");
        return "Hello World ~~";
    }
    @RequestMapping("/getAddr")
    public Address getAddr(){
        Address addr = new Address();
        addr.setProvince("广东");
        addr.setCity("深圳");
        return addr;
    }

    @RequestMapping("/listAddr")
    public List<Address> listAddr(){
        List<Address> list = new ArrayList<Address>();
        Address addr1 = new Address();
        addr1.setProvince("广东");
        addr1.setCity("深圳");
        Address addr2 = new Address();
        addr2.setProvince("陕西");
        addr2.setCity("西安");
        list.add(addr1);
        list.add(addr2);
        return list;
    }
}

 

 

统一响应结果

package org.example.springbootweb.pojo;

public class Result {
    //1表示成功,0表示失败
    private Integer code;
    private String msg;
    private Object data;
    public Result() {}

    public Result(Integer code, String msg, Object data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
    public static Result success(Object data) {
        return new Result(1,"success",data);
    }
    public static Result success() {
        return new Result(1,"success",null);
    }
    public static Result error(String msg) {
        return new Result(0,msg,null);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }
}
<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.3</version>
</dependency>

 注:dom4j用于解析XML文件。

分层解耦

三层架构

 

  • controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • service:业务逻辑层,处理具体的业务逻辑。
  • dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增、删、改、查。 

接收请求,响应数据

业务逻辑处理

数据访问操作

拆分前后对比

分层解耦 

  •  内聚:软件中各个功能模块内部的功能联系。
  • 耦合:衡量软件中各个层/模块之间的依赖、关联的程度。
  • 软件设计原则:高内聚低耦合。

 

  • 控制反转: Inversion Of Control,简称IOC。对象的创建控制权由程序自身转移到外部(容器),这种思想称为控制反转。
  • 依赖注入: Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称之为依赖注入。
  • Bean对象:IOC容器中创建、管理的对象,称之为bean。 

IOC & DI 入门

①. Service层 及 Dao层的实现类,交给IOC容器管理。

@Component
public class EmpDaoA implements EmpDao {
    public List<Emp> listEmp() {
        //1. 从文件中查询数据        
        String file = this.getClass().getClassLoader().getResource(“emp.xml").getFile();                   
        List<Emp> empList = XmlParserUtils.parse(file,Emp.class);
        return empList;
    }
}

②. 为Controller及Service注入运行时,依赖的对象。 

@RestController
public class EmpController {
    @Autowired
    private EmpService empService ;    
    @RequestMapping("/listEmp")
    public Result list() throws Exception {
        List<Emp> empList = empService.listEmp();
        return Result.success(empList);
    }
}
@Component
public class EmpServiceA implements EmpService {
    @Autowired
    private EmpDao empDao ;
    public List<Emp> listEmp()  {
        //调用 dao 层, 查询数据
        List<Emp> empList = empDao.listEmp();
        //……

  ③. 运行测试。

Bean的声明

 要把某个对象交给IOC容器管理,需要在对应的类上加上如下注解之一:

注解说明位置
@Component声明bean的基础注解声明bean的基础注解
@Controller@Component的衍生注解标注在控制器类上
@Service@Component的衍生注解标注在业务类上
@Repository@Component的衍生注解标注在数据访问类上(由于与mybatis整合,用的少)

 注意事项:

  • 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
  • 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller。
  • @RestController@Controller@ResponseBody 的组合,使用 @RestController 的类可以直接处理 HTTP 请求并返回 JSON 或其他格式的响应。

Bean组件扫描

  •  前面声明bean的四大注解,要想生效,还需要被组件扫描注解@ComponentScan扫描。
  • @ComponentScan注解虽然没有显式配置,但是实际上已经包含在了启动类声明注解 @SpringBootApplication 中,默认扫描的范围是启动类所在包及其子包。

 Bean注入

@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:

通过以下几种方案来解决:‘

  • @Primary:当 Spring 容器中有多个 Bean 实现了相同的接口或继承了相同的父类时,使用 @Primary 注解标记的 Bean 将作为默认的 Bean 被注入。
  • @Qualifier:用于在有多个同类型的 Bean 时指定注入的 Bean。它与 @Autowired 一起使用,帮助 Spring 确定哪个 Bean 应该被注入。
  • @Resource:@Resource(name = "primaryService") 指定将 PrimaryService 实例注入到 myService 字段中。@Resource 可以根据名称匹配 Bean,如果没有指定名称,则使用字段名作为默认名称。
@Primary
@Service
public class EmpServiceA implements EmpService {
}
RestController
public class EmpController {
    @Autowired
    @Qualifier("empServiceA")
    private EmpService empService ;
}
@RestController
public class EmpController {
    @Resource(name = "empServiceB")
    private EmpService empService ;
}

@Resource 与 @Autowired区别:

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解。
  • @Autowired 默认是按照类型注入,而@Resource默认是按照名称注入。 

总结

希望上述内容能够帮助大家更好的理解Spring框架中的IOC、DI和Bean对象!!!

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

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

相关文章

MVC与设计模式理解-lnmp学习之路

一、MVC 前言&#xff1a; MVC是一种应用架构模式&#xff0c;也可以说是一种业务架构或是一种应用设计思想&#xff0c;用于组织业务逻辑并分离代码的。 MVC组成结构是Model-View-Controller&#xff0c;Model是管控数据层&#xff0c;View是管控视图层&#xff0c;Controlle…

【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值

🎬【Unity-UGUI组件拓展】| ContentSizeFitter 组件拓展,支持设置最大宽高值一、组件介绍二、组件拓展方法三、完整代码💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲…

图新地球桌面端-给地块贴纹理都是正北方向如何调整

0序 有部分做农保、农业管理的客户&#xff0c;需要结合GIS做一些方案效果&#xff0c;有时候会直接把面对象贴上作物类型的纹理&#xff0c;看上去会比纯色块更好看一些。而又不需要去做复杂的人工建模。 本文的重点是对导入的纹理进行角度调整&#xff0c;让纹理和地块的方向…

UE5开发——射击游戏

1. 枪支拾取动画 创建Text Block 编译保存 在h文件写入 &#xff0c;属性 private:UPROPETY(VisibleAnywhere, Category "Weapon Properties")class UWidgetComponent* PickupWidget; 先写这个&#xff1a; CreateDefaultSubobject<UWidgetComponent>(TEXT(…

JavaWeb——介绍(什么是Web、Web网站的开发模式)、初始Web前端(Web标准、学习内容)

目录 介绍 什么是Web Web网站的开发模式 初识Web前端 Web标准 学习内容 介绍 JavaWeb学习路线 &#xff08;仅用作参考&#xff09; 什么是Web Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www World Wide Web)&#xff0c;能够通过浏览器访问的…

数据结构之内核链表,栈,队列

今天主要学习了内核链表&#xff0c;顺序栈&#xff0c;链式栈&#xff0c;顺序队列&#xff0c;链式队列的相关内容。 一.内核链表 内核链表和之前的单向&#xff0c;双向链表有所不同的是内核链表的结构是数据包含节点&#xff0c;特点如下&#xff1a; 1.一种链表结构能够操…

系统架构设计师——系统工程学

概述. 系统工程是一种跨学科的方法论&#xff0c;旨在通过系统方法组织管理技术来实现系统的规划、研究、设计、制造、试验和使用。它的核心在于从整体的角度出发&#xff0c;合理地开发、设计、实施和运用系统科学和技术&#xff0c;确保系统能够成功地实现其预定目的。以下是…

适用于车队管理和试验验证的数据记录仪-IPE853

IPE853是一款可扩展的数据记录仪&#xff0c;支持整车质量保证中的各项测量任务。它具有CAN/CAN FD、LIN、以太网等众多测量输入接口&#xff0c;并支持CCP/XCPonCAN、XCPonETH、J1939、OBD、WWH-OBD、KWPonCAN、UDS/ODX/PDX和CAN-send等多种协议&#xff0c;因此其可轻松访问汽…

vscode在html中的使用

目录 一、安装插件二、通过live Server 小型服务器运行项目三、其他常见设置 一、安装插件 ● Auto Rename Tag 自动修改标签对插件 ● Chinese Language Pack 汉化包 ● HTML CSS Support HTML CSS 支持 ● Intellij IDEA Keybindings IDEA快捷键支持 ● Live Server 实时加载…

解决线程中使用线程锁

问题&#xff1a;多线程操作同一个对象&#xff0c;利用锁保证数据操作的原子性 解决方案&#xff1a;使用线程锁 简要说明&#xff1a;线程锁本质上就是添加一个公共状态量&#xff0c;当线程拿到状态量后&#xff0c;则继续执行&#xff0c;否则就等待 扩展1&#xff1a;自…

【文献及模型、制图分享】大运河江苏段沿线典型传统村落空间形态特征与影响因素及其启示

文献介绍 大运河见证了中国数千年的繁荣与变迁&#xff0c;沿线传统村落是其历史文化的直接展示。对这些村落的空间形态进行研究&#xff0c;不仅能够深入了解传统村落形态特征&#xff0c;还为其保护和发展提供有力的支持。以大运河江苏段沿线的48个传统村落为研究对象&#…

C++入门基础知识40——【关于C++ 运算符——赋值运算符】

成长路上不孤单&#x1f60a;【14后&#xff0c;C爱好者&#xff0c;持续分享所学&#xff0c;如有需要欢迎收藏转发&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#xff01;&#xff01;&#xff01;&#xff01;&#xff…

大数据-107 Flink 基本概述 适用场景 框架特点 核心组成 生态发展 处理模型 组件架构

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

CSS3中的字体详解

字体 网页字体的三个来源&#xff1a; 用户机器上安装的字体&#xff0c;放心使用。保存在第三方网站上的字体&#xff0c;例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字体&#xff0c;可以用font-face规则随网页一起发送到浏览器。 字体相…

【文献及模型、制图分享】传统村多功能发展特征识别、类型划分与差异化引导——以安徽黟县44个传统村为例(多指标综合法及耦合协调模型

文献介绍 揭示多功能发展特征、划定多功能协同发展类型是传统村落传承保护与活化利用的现实需要&#xff0c;是传统村落保护发展研究的重要议题。以黟县44个中国传统村落为研究对象&#xff0c;采用多指标综合法及耦合协调模型&#xff0c;科学测度传统村落多功能发展水平及协…

【赵渝强老师】MongoDB的存储引擎

存储引擎&#xff08;Storage Engine&#xff09;是MongoDB的核心组件&#xff0c;它负责管理数据如何存储在硬盘&#xff08;Disk&#xff09;和内存&#xff08;Memory&#xff09;上。从MongoDB 3.2 版本开始&#xff0c;MongoDB支持多种类型的数据存储引擎。 视频讲解如下&…

“JavaScript里的多线程“WebWorker

"JavaScript里的多线程"WebWorker 引言 简要介绍主题&#xff1a; WebWorker 是一种在 Web 开发中用来解决 JavaScript 单线程限制的重要技术。通过 WebWorker&#xff0c;可以将一些复杂或耗时的任务放到后台线程中执行&#xff0c;从而避免阻塞主线程&#xff0c;…

Java 7.1 - 理论 算法 协议

什么是 CAP 理论&#xff1f; C&#xff1a;Consistency 一致性 A&#xff1a;Availability 可用性 P&#xff1a;Partition 分区容错性 对于理论计算机科学&#xff0c;CAP 定理指出&#xff0c;对于一个分布式系统而言&#xff0c;CAP 中的三个只能同时满足两个。 分区容…

从算法到硬件实现:《基于FPGA的数字信号处理》(可下载)

数字信号处理是现代电子系统中不可或缺的核心。FPGA是实现复杂DSP算法的理想平台。《基于FPGA的数字信号处理&#xff08;第2版&#xff09;》由资深工程师高亚军编著&#xff0c;是一本深入探讨FPGA在数字信号处理领域应用的专业书籍。 本书以Xilinx新一代28nm工艺芯片7系列FP…

设计模式 -- 组合模式(Composite Pattern)

1 问题引出 编写程序展示一个学校院系结构&#xff1a;需求是这样&#xff0c;要在一个页面中展示出学校的院系组成&#xff0c;一个学校有多个学院&#xff0c; 一个学院有多个系。如图&#xff1a; 2 基本介绍 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c…