主要介绍了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);}@Overridepublic 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 {@Autowiredprivate EmpService empService ; @RequestMapping("/listEmp")public Result list() throws Exception {List<Emp> empList = empService.listEmp();return Result.success(empList);}
}
@Component
public class EmpServiceA implements EmpService {@Autowiredprivate 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对象!!!