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

主要介绍了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对象!!!

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值