分层解耦-

文章详细介绍了JavaWeb开发中的三层架构,包括Controller、Service和DAO层的功能,以及它们之间的交互流程。同时,文章探讨了IOC(控制反转)和DI(依赖注入)的概念,解释了如何通过这些原则实现高内聚低耦合,并提到了Spring框架中的相关注解如@Component、@Controller、@Service等在实现这些概念中的作用。此外,还讨论了解决Bean注入时可能出现的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三层架构

controller:

        叫做控制层,主要的功能是处理用户发送的请求。主要处理外部请求。调用service层,将service层返回的BO/DO转化为DTO/VO并封装成统一返回对象返回给调用方。如果返回数据用于前端模版渲染则返回VO,否则一般返回DTO。不论是DTO还是VO,一般都会对BO/DO中的数据进行一些转化和整合,比如将gender属性中的0转化“男”,1转化为“女”等。controller的功能主要有5点:参数校验、调用service层接口实现业务逻辑、转换业务/数据对象、组装返回对象、异常处理。

service:

        业务层,用来实现业务逻辑。能调用dao层或者service层,返回数据对象DO或者业务对象BO,BO通常由DO转化、整合而来,可以包含多个DO的属性,也可以是只包含一个DO的部分属性。通常为了简便,如果无需转化,service也可以直接返回DO。外部调用(HTTP、RPC)方法也在这一层,对于外部调用来说,service一般会将外部调用返回的DTO转化为BO。是专注业务逻辑,对于其中需要的数据库操作,都通过Dao去实现。主要去负责一些业务处理,比如取得连接、关闭数据库连接、事务回滚,一些复杂的逻辑业务处理就放到service层。

dao:

        负责访问数据库进行数据的操作,取得结果集,之后将结果集中的数据取出封装到VO类对象之后返回给service层。数据层,直接进行数据库的读写操作,返回数据对象DO,DO与数据库表一一对应。Dao的作用是封装对数据库的访问:增删改查,不涉及业务逻辑,只是达到按某个条件获得指定数据的要求。

流程

        Controller层接收到浏览器发送的请求,调用Service进行处理逻辑业务,再由Service层调用dao层访问数据库对数据进行增删改查操作。数据库再返回更新后的数据到dao层和Service,再返回Controller层,Controller层返回网页,将更新后的数据渲染到页面。

分层解耦

软件设计原则:高内聚低耦合。

内聚:软件中各个功能模块内部的功能联系。

耦合:衡量软件中各个层/模块之间的依赖、关联程度。

IOC&DI(实现高内聚低耦合)

IOC:控制反转,对象的创建控制权由程序自身转移到外部(容器),这种思想成为控制反转

DI:依赖注入,容器为i用用程序提供运行时,所依赖的资源,称之为依赖注入

Bean对象:IOC容器中创建、管理的对象,称之为bean

使用:Service层及Dao层的实现类交给IOC容器管理,为Controller及Service注入运行时,依赖的对象

常用注解
 

注解说明位置
@Component声明bean的基础注解不属于以下三类时,用此注解
@Controller        @Component的衍生注解标注在控制器上
@Service        @Component的衍生注解标注在业务类上

@Repository

@Component的衍生注解标注在数据访问类上(mybatis整合)
注解位置说明
@RestControllerController层类上方将该类下的所有方法的返回值都默认为JSON格式的数据
@RequestMappingController层处理方法上方将HTTP请求映射到处理方法上,可以指定HTTP请求的方法类型
@Repository        Dao层类上方将数据访问代码与业务逻辑代码分开,使得更改数据访问层不会影响业务逻辑层(对数据增删改查)
@ServiceService层类上方将一个类声明为业务逻辑组件,并将其对象存入 Spring 容器中
@RequestParamController层方法传参,参数前传递参数,用于将请求参数区数据映射到功能处理方法的参数上,如果前后端传输参数名字不一样可以用@RequestParam
@DateTimeFormat接收的类中对应的时间类型属性,并在注解中加上pattern属性定义日期格式

Bean注入

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

 解决方案:

@Primary

@Qualifier

@Resource

 

 

### FreeRTOS 中的分层架构与模块解耦设计 在 FreeRTOS 的设计中,采用了典型的分层架构来实现系统的模块化和解耦合。这种结构不仅遵循了嵌入式软件开发中的高层次抽象原则[^2],还使得不同层次之间的交互更加清晰明了。 #### 底层硬件适配层 (Hardware Abstraction Layer, HAL) HAL 是最接近物理设备的一层,在这一层实现了对具体微控制器外设的操作接口封装。这些函数通常由芯片厂商提供或者开发者自行编写,目的是为了屏蔽掉不同的硬件差异,从而让上层的应用程序可以不关心具体的硬件细节而正常工作。 ```c // 示例:简单的 LED 控制 API 定义于 HAL 层 void hal_led_init(void); void hal_led_on(uint8_t led_num); void hal_led_off(uint8_t led_num); ``` #### 内核服务层 (Kernel Service Layer) 该层包含了操作系统的核心功能和服务,比如任务管理、时间管理和信号量机制等。FreeRTOS 提供了一系列标准的任务控制APIs用于创建、删除以及调度线程;同时也提供了同步原语如互斥锁(mutexes),事件组(event groups) 和队列(queues)[^1]。 ```c // 创建新任务的例子 BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char *const pcName, uint16_t usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t *pxCreatedTask ); // 使用队列传递消息给其他任务 QueueHandle_t xQueue; xQueueSend(xQueue, &dataToSend, portMAX_DELAY); ``` #### 用户应用程序层 (Application Layer) 这是最高级别的逻辑处理部分,它利用下两层所提供的资源完成实际业务需求。由于有了前面提到的良好隔离措施,这里的编程变得相对简单很多——只需要调用相应的库函数即可执行所需操作而不必担心底层复杂性的影响。 ```c // 用户空间内的典型代码片段 void app_task_function(void *parameters){ while(true){ // 执行某些周期性的任务... vTaskDelay(pdMS_TO_TICKS(100)); // 延迟一段时间 // 发送数据到另一个任务或中断 BaseType_t result = xQueueSend(queue_handle, message_ptr, 0UL); } } ``` 通过上述三层式的组织方式,FreeRTOS 成功地将复杂的实时多任务环境简化成了易于理解和使用的组件集合体。这既有利于提高开发效率也方便后期维护升级。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值