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