MVC RestfulApi
-Model
-View
-Controller
-Service
Controller:
一、 @Controller 与 @RestController 的区别
二、@RequestMapping:放在类上和方法上的区别
HttpServletResponse HttpServletRequest
参考链接: https://www.iteye.com/news/32657/
1. 处理单个URI
//处理各种http方法,默认是Get方法
@RequestMapping(method = RequestMethod.POST)
2. 处理多个URI
@RequestMapping(value={
"",
"/page",
"page*"
})
String indexMultipleMapping(){return "Hello";}
@GetMapping //放在方法上:
@RequestParam(required = false, defaultValue = "1") Integer page //放在参数前
@GetMapping("{id}") //动态参数
getMapping(@PathVariable Integer id) //接收动态参数
@PostMapping:
@Autowired : 自动导入Service的bean
三、@Slf4j: log设置
四、集成swagger-ui
五、@ControllerAdvice:拦截异常并统一处理的全局配置,并且应用到所有的@RestMapping中
注解了@ControlleAdvicer的类可以使用以下三个注解修饰方法:
1. @ExceptionHandler
2. @InitBinder
3. @ModelAttribute
??它的底层实现原理??
--------------------------------
Spring boot 默认情况下会映射到/error 进行异常处理,通过自定义异常可以处理继承
以下,编程全局异常处理类
/**
* 405相关异常
*
* @param rep {@link HttpServletResponse}
* @param ex {@link Exception}
* @return {@link RestResponse}
*/
@ExceptionHandler({HttpRequestMethodNotSupportedException.class})
public RestResponse request405(HttpServletResponse rep, Exception ex) {
rep.setStatus(ErrorCode.METHOD_BOT_ALLOWED.getCode());
return RestResponse.fail(ErrorCode.METHOD_BOT_ALLOWED.getCode(), ex.getMessage());
}
/**
* 全局异常返回
*
* @param req {@link HttpServletRequest}
* @param e {@link HttpServletResponse}
* @return {@link Exception}
*/
@ExceptionHandler(value = Exception.class)
public RestResponse defaultErrorHandler(HttpServletRequest req, HttpServletResponse rep, Exception e) {
log.error("---DefaultException Handler---Host {}, invokes url {}, ERROR TYPE: {}, ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getClass(), e.getMessage());
e.printStackTrace();
return RestResponse.fail(e.getMessage());
}
/**
* 应用到所有的@RequestMapping 注解方法,在其执行之前初始化数据绑定器
**/
@InitBinder
public void initBinder(WebDataBinder binder){
}
/**
*
* 把值绑定到Model中,使全局@RequestMapping可以获取到该值
*
* 通过ModelMap获取 或者通过 @ModelAttribute("SS")
* **/
@ModelAttribute
public void addAttribute(Model model){
model.addAttribute("SS","s");
}
--------------------------------
集成Swagger:
依赖导入:
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId> //包含前端UI依赖js/css资源
<version>2.8.0</version>
</dependency>
第一步:编写配置文件
第二部: 在各各Controller添加注解
第三部: 打开浏览器,访问http://localhost:8080/swagger-ui.html
--------------------------------
参考链接:http://www.cnblogs.com/duanxz/p/3748087.html
Service层
注解
@Slf4j
@Service("ServiceName") =>指定这是一个Service
@Primary => @Primary注解的实例优先于其他实例被注入
@Resource =>按照名称被装配
@Autowired => 默认按类型装配
@Qualifier(“DataDao”) =>当一个接口有多个不同实现,使用@Autowired注解会报错
@Transactional(rollbackFor = Throwable.class) =>每个业务方法执行时,都会开启一个事物,按照相同的管理机制,只能应用到public修饰符上
解决注解不回滚问题 :
- 检查方法是不是public
- 检查异常是不是unchecked
- 如果是checked异常也想回滚到话,注解上写明异常即可
@Async :Spring 3.x之后内置,被标注称之为异步方法
同时也加了@Transactional注解将无法产生事务管理的控制,放到异步方法内部
Model层的注解
常用注解:
lombok的用法
@Data:注解在类上,为类提供读写属性,此外还提供equals()和hashCode()方法
@EqualsAndHashCode(callSuper = false)提供equals()和hashCode()方法
@Builder:注解在类上,为类提供一个内部的Builder
https://blog.csdn.net/u013225178/article/details/80721799
https://blog.csdn.net/qq_16605855/article/details/80611037 lombok原理
@Data
public class BaseEntity {
@Id
@Column(name = "Id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer id;
}
//@Column 是属性或方法级别的注解,用于指定持久化属性映射到数据库表的列。如果没有指定列注释,则使用其默认值。
//生成对应表信息,列
有关概念:
参考链接: https://www.cnblogs.com/lyjin/p/6389349.html
Object/Relation Mapping
po(Persistent object):po的每个属性基本上对应数据库表里的某个字段
vo(Value object):通常用于业务之间的数据传递,抽象出的业务对象(比如前后端交互数据),可以和表对应,也可以不用,根据业务需要
表现层对象(View object):封装了对应页面显示的数据对象,用一个vo来封装整个页面展示所需要的对象数据
bo:(Business Object):封装业务逻辑的Java对象,通过调用DAO方法,结合po,vo进行操作
一个业务bo,可能包含多个po
dto(Data Transfer Object)数据传输对象: 是一种设计模式之间传输数据的软件应用系统
是一组需要跨进程或网络边界传输的聚合数据的简单容器,序列化传递
只作为数据的存储,没有任何业务行为
dto中定义的实体类,该文件中包含实体类的属性和对应实体类属性的get、set方法
Dto类似信使
当我们在业务逻辑层或者交互层用到一些数据库中部分的字段而不是所以字段,就需要在Dto类里放这些字段,这些字段的意义相当于一些经处理过的数据库字段,实际意义就是方便数据交互,提高效率
比如一个对象1有20个字段,我们只需要10个字段,就不需要把整个po对象传输到客户端,而是用Dto重新封装
dao层会调用dto层
JavaBean:一种可重用组件。
更多的是一种规范,一组包含set和get方法的java对象
满足三个条件:
- 类必须是具体和公共的
- 具有无参构造器
- 提供一致性设计模式的公共方法将内部域暴露成员属性
——Session bean:会话构件,短暂的对象
——Entity bean:实体构件,持久对象
——MessageDrivenBean:消息构件
Pojo:(Plain Ordinary Java Object)简单java对象,方便程序员使用数据库中的数据表的增删改查,不涉及业务逻辑
一个Pojo持久化就是PO
直接用它传递,传递过程中就是DTO
直接用来对应表示层就是VO
dao层:数据库访问对象(Data Access Object),一般操作单表,它可以把pojo持久化为Po,用Po组装出来Vo,DTO
domain:用来管理javabean实体对象,考虑业务逻辑,过滤、数据处理为调用dao层做好准备,domain对象有时需序列化,因为需要将对象序列化存储到Redis,如果没有实现就会爆出异常
Do (Domain Object)抽象出来的有形或者无形的实体
mybatis
存储数据模型Model,可以使用mapper做映射,集成mybatis
https://blog.csdn.net/tuxedolinux/article/details/80876087 JPA常用注解
https://blog.csdn.net/yswknight/article/details/79257372 JPA注解
XML + 注解
Mybatis
原理
https://blog.csdn.net/u014745069/article/details/80788127
实际上mybatis的所有配置信息以及运行时的配置参数全部都保存在configuration对象中。
将sql语句的所有信息封装成MappedStatement对象,然后存储在configuration对象
解析该sql对应的class,并把该class放到configuration中的mapperRegistry中
https://blog.csdn.net/lchpersonal521/article/details/84451357 较为详细
jdk的动态代理
四大对象: Executor Interceptor..。
核心类:SqlSessionFactory SqlSession Configuration Executor
缓存:一级缓存 二级缓存
- 依赖导入 mybatis,mysql Connector
- 接口使用@Mapper注解 或者 入口处@使用@MapperScan(“mapper类包对应类路径”)注解
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
//Articles为model类,一个pojo
public interface ArticlesMapper extends MyMapper<Articles>{
}
常用注解:
@Insert
@Select
@Update
@Delete
@Param
@Results
@Result
HandlerInterceptor
//AOP实现拦截器
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
//底层为servlet
admin监控 actuator升级版,拉取注册中心数据,把自己也注册进去
https://blog.csdn.net/u010562966/article/details/86636469
网友评论