三层架构
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整合) |
注解 | 位置 | 说明 |
@RestController | Controller层类上方 | 将该类下的所有方法的返回值都默认为JSON格式的数据 |
@RequestMapping | Controller层处理方法上方 | 将HTTP请求映射到处理方法上,可以指定HTTP请求的方法类型 |
@Repository | Dao层类上方 | 将数据访问代码与业务逻辑代码分开,使得更改数据访问层不会影响业务逻辑层(对数据增删改查) |
@Service | Service层类上方 | 将一个类声明为业务逻辑组件,并将其对象存入 Spring 容器中 |
@RequestParam | Controller层方法传参,参数前 | 传递参数,用于将请求参数区数据映射到功能处理方法的参数上,如果前后端传输参数名字不一样可以用@RequestParam |
@DateTimeFormat | 接收的类中对应的时间类型属性,并在注解中加上pattern属性 | 定义日期格式 |
Bean注入
@Autowired注解,默认是按照类型进行,如果存在多个相同类型的bean,将会报出如下错误:
解决方案:
@Primary
@Qualifier
@Resource