每一层对应每个包,包名中应全为小写。
一、Common 层(实体类)
前提:导入 Lombok 依赖
@Data:生成 get 和 set 方法以及 toString 方法
@Getter:只生成 get 方法,避免对类中的成员变量修改。
@EqualsAndHashCode(callSuper = false):重写 equals 和 hashCode 方法
@AllArgsConstructor:生成全参的构造方法
@NoArgsConstructor:生成无参的构建方法
@Builder(access = AccessLevel.MODULE):实现不可变对象的创建,避免直接使用构造函数初始化各个字段,并提供了一种链式调用的方式来设置对象属性。
使用方法
以下是 mybtis - plus下的实体类字段常用注解
@TableId(value = "id", type = IdType.AUTO):标识主键,可以根据 value 来对应表中字段名称,type 为主键的自增
@TableField("PLATFORM_TYPE"):当该注解的 value 值与表中的字段名称一致时,在进行 sql 编写时就不需要再进行别名处理了,会自动映射实体类的属性名称。
@TableField(exist = false):标识该属性在对应的表中不存在,不会加入到 mybatis - plus 提供的自动生成的 sql 语句中。
以下是对实体类中存在的日期格式的类型的格式指定
@JsonFormat:将 Java 对象序列化为 JSON 格式时,日期类型字段的格式化方式。
@DateTimeFormat:用于将请求参数绑定到 Java 对象时,日期类型字段的格式化方式。
//两个注解可以连用
@JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8") //后端 --> 前端
@DateTimeFormat(pattern = "yyyy-MM-dd") //前端 -->后端
private Date updateTime;
二、Dao / Mapper 层(数据访问层)
@Repository:将数据库访问异常翻译为 Spring 提供的统一的数据访问异常类型,将类加入到 Spring 容器中。
@Mapper :将类加入到 Spring 容器中,告诉 MyBatis 框架对应的接口是一个映射器接口,需要动态生成对应的实现类。
@DS( DBConstants.DATASOURCE_GZZT_MYSQL):对于多数据源的项目用来指定数据源。
三、Service 层(业务逻辑层)
@Service:将类加入到 Spring 容器中。
@Autowired:根据类型在 Spring 容器中匹配相应的Bean。
@Qualifier:如果存在多个匹配的Bean,可以用该注解指定一个来使用,与 @Autowired 连用。
@Resource:通过名称进行自动装配。
@AutoWired和@Resource注解的区别如下:
-
注入方式:@Autowired是Spring提供的注解,通过类型进行自动装配;@Resource是JavaEE提供的注解,通过名称进行自动装配。
-
匹配规则:@Autowired默认按照类型进行匹配,如果存在多个匹配的Bean,则可以通过@Qualifier注解指定具体的Bean;@Resource默认按照名称进行匹配,如果存在多个匹配的Bean,则会根据容器的默认规则进行选择。
-
扩展性:@Autowired是Spring提供的注解,更加灵活,可以与其他Spring注解配合使用;@Resource是JavaEE提供的注解,不支持与其他注解的配合使用。
总的来说,@Autowired是Spring推荐使用的注解,更加灵活和强大,而@Resource是JavaEE提供的注解,更加符合JavaEE的规范。在实际使用中,可以根据具体的需求选择合适的注解。
@Value("${effFileNameLocalDirPath}"):一般用来匹配配置文件中的属性值。
@Transactional:可以添加在类和方法上,用来进行事务管理。
@Slf4j:开启日志,通过 log.info(),打印日志,在 Lombok 包下。
四、Controller 层(控制器层)
1、在类上使用的注解
@Controller:用于标识控制器类,处理请求并返回视图。
@RestController:用于标识控制器类,处理请求并将响应结果转换为 JSON 或 XML 等格式。
@RequestMapping:可以在类级别或方法级别使用,用于指定请求URL的路径。
@CrossOrigin:开启跨域。
2、在方法上使用的注解
@RequestMapping:可以在类级别或方法级别使用,用于指定请求URL的路径。 @GetMapping:简化的@RequestMapping,符合 RESTful 风格,用于处理GET请求,一般是对应的查询业务。
@PostMapping:用于处理POST请求,一般对应添加业务,如果页面传递的参数为一个 JSON 对象,就必须使用 POST 请求,使用 GET 请求会报错。
@PutMapping:用于处理PUT请求,一般对应修改业务。
@DeleteMapping:用于处理DELETE请求,一般对应删除业务。
@ResponseBody:将方法的返回值封装为 JSON 对象。
3、在参数上使用的注解
@GetMapping("one/{productId}") public ResultData one(@PathVariable Integer productId)
URL:http://localhost:8080/order/one/1
@PathVariable:参数值对应的是 URL 中传递的值。
public ResultData params(@RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "5") Integer size)
URL:http://localhost:8080/order/all?page=1&size=5
@RequstParam:参数值对应的时 URL 中传递的参数值。
@RequestBody:将前端传递的请求体(JSON 格式)转换为对应的 Java 实体类。
4、异常处理器
@ExceptionHandler:用于处理控制器中出现的异常,可以针对特定的异常类型进行处理。
@ControllerAdvice:结合 @ExceptionHandler 注解在一个类中定义全局异常处理器。
@RestControllerAdvice:将异常处理的结果封装为 JSON 格式。
@Component:如果使用自定义的异常处理器,使用该注解将该类注入到 spring 容器中。
以下是自定义拦截器的实现:
@Component
public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
/**
*
* @param httpServletRequest request对象
* @param httpServletResponse response对象
* @param o 出现异常的Controller对象
* @param e 异常
* @return
*/
@Override
public ModelAndView resolveException(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse,
Object o,
Exception e) {
ModelAndView modelAndView = new ModelAndView();
//1、可以通过异常的类型,来做出不同处理
if(e instanceof LongException){
modelAndView.setViewName("error");
}else if(e instanceof OrderException){
modelAndView.setViewName("error");
}else if(e instanceof PayException){
modelAndView.setViewName("error");
}
//2、前端分离项目。通过响应流进行进行响应
httpServletResponse.getWriter().write(jsonStr);
//打印异常信息
e.printStackTrace();
return modelAndView;
}
}
五、Config 层 (配置类)
@Configuration:用于标识一个类为配置类,配置类中可以定义 Bean 的创建和依赖关系。
@Bean:用于定义一个 Bean 的配置信息并注入 Spring 容器中。通常用于 @Configuration 类中的方法上。
六、Interceptor 层 (拦截器)
@component:用于标识一个类为Spring容器管理的组件(Bean),可以用于任何类。
拦截器类一般都是通过实现 HandlerInterceptor 接口的三个方法来进行请求的拦截。
@Component
public class LoginInterceptor implements HandlerInterceptor { //AOP
@Override
public boolean preHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入到Handler之前执行【进行拦截操作】");
HttpSession session = request.getSession();
Object loginUser = session.getAttribute("loginUser");
if(loginUser == null){
response.sendRedirect(request.getContextPath()+"/pages/login.jsp");
return false;
}
return true; //是否放行 false表示不放行 true放行
}
@Override
public void postHandle(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("进入到Handler之后执行【进行后续操作】");
}
@Override
public void afterCompletion(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("当请求成功之后数据渲染完成执行【资源释放】");
}
}
在完成拦截器的实现之后还需要将拦截器配置到 Web 的配置类中。
@Configuration
public class MyWebConfig implements WebMvcConfigurer {
@Autowired
//配置的拦截器类
private LoginInterceptor loginInterceptor;
//文件上传配置
//添加虚拟路径,相同于通过一个路径来访问本地磁盘上的内容
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/image/**")
.addResourceLocations("file:D:\\upload\\");
}
@Override
//跨域配置
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //请求的资源 /**表示所有资源 、
.allowedOrigins("*") //允许指定的源能访问
.allowedHeaders("*") //允许携带的请求头
.allowedMethods("*"); //允许的请求方式
//注意:当设置允许携带Cookie不允许将指定源设置为所有
}
@Override
//拦截器配置
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor) //添加拦截器类
.excludePathPatterns("/")
//.addPathPatterns("/**") //添加拦截的路径
.excludePathPatterns("/user/**"); //添加排除路径
}
}
以上就完成了整个拦截器的实现。
拦截器(Interceptor)和过滤器(filter)之间的区别如下:
-
触发时机:拦截器是在请求处理的前后触发,可以对请求进行预处理和后处理;而过滤器是在请求到达Servlet之前或响应返回客户端之前触发。
-
对象范围:拦截器是针对Handler(Controller)级别的,它只能拦截处理器方法的调用;而过滤器是对Servlet容器级别的,它可以拦截整个请求响应链。
-
依赖关系:拦截器依赖于Servlet容器,例如Spring MVC中的DispatcherServlet;而过滤器是独立于Servlet容器的,可以在任何符合Servlet规范的容器中使用。
-
功能定位:拦截器主要用于业务逻辑的处理,可以在请求前或请求后进行处理、日志记录、权限校验等;而过滤器主要用于请求过滤,可以对请求和响应进行过滤、处理编码、安全验证等。
七、Advice 层(切面层)
@Aspect:标识该类为一个切面类。
@Component:用于扫描指定包下的组件,将其注册为Spring的Bean。
@PointCut:切入点,表示在应用程序中可以被拦截到的具体的点,比如方法调用、异常抛出等。
@Before:前置通知。
@After:最终通知。
@AfterRerurning:后置通知。
@AfterThrowing:异常通知。
@Around:环绕通知。
综合使用可以通过 Spring 的切面编程在开发中的使用-CSDN博客 案例实现。
以下是对五种通知方式的解释:
/**
execution 表达式的使用
*:表示任意 ..:表示任意参数
完整表示:public void com.service.impl.UserServiceImpl.addUser();
以下是省略表述:
void com.service.impl.UserServiceImpl.addUser();
* com.service.impl.UserServiceImpl.addUser(..);
* com.service.*.*Impl.*(..)
*/
@Before("execution(* com.service.*.*Impl.*())")
public void before(){
System.out.println("前置通知,在目标方法执行之前就执行(相当于开启事务)注解");
}
@After("execution(* com.service.*.*Impl.*())")
public void after(){
System.out.println("最终通知,在目标方法执行之后执行(相当于finally 无论异常与否都会返回)注解");
}
@AfterReturning("execution(* com.service.*.*Impl.*())")
public void afterReturning(){
System.out.println("后置通知,在目标方法返回返回值之后执行(相当于关闭事务)注解");
}
@AfterThrowing("execution(* com.service.*.*Impl.*())")
public void afterThrowing(){
System.out.println("异常通知,在目标方法中出现异常是执行(相当于回滚事务)注解");
}
@Around("execution(* com.service.*.*Impl.*())")
public Object around(ProceedingJoinPoint joinPoint){
Object obj=null;
try{
System.out.println("前置通知,在目标方法执行之前就执行(相当于开启事务)注解");
//调用proceed()方法可以继续执行被增强的方法。
obj=joinPoint.proceed();
System.out.println("后置通知,在目标方法返回返回值之后执行(相当于关闭事务)注解");
} catch (Throwable e) {
System.out.println("异常通知,在目标方法中出现异常是执行(相当于回滚事务)注解");
throw new RuntimeException(e);
}finally {
System.out.println("最终通知,在目标方法执行之后执行(相当于finally 无论异常与否都会返回)注解");
}
return obj;
}
八、SpringBoot 启动类上的注解
@SpringBootApplication:用于标注主类,表示这是一个Spring Boot应用程序的入口类,同时也包含了 @EnableAutoConfiguration 和 @ComponentScan 注解。
@ComponentScan:用于扫描指定包下的组件,将其注册为Spring的Bean。
@EnableAutoConfiguration:用于自动配置Spring应用程序,根据类路径下的依赖自动配置Bean。
@MapperScan:指定 MyBatis Mapper 接口所在的包,Spring 在启动时会扫描指定的包路径,并注册这些 Mapper 接口的实现类作为 Bean。
@EnableScheduling:用于开启定时任务的支持。
当开启定时任务时在对应的方法上添加 @Scheduled 注解可以将该方法设置为一个定时任务。
@Scheduled(cron = "0 */5 * * * ?"):标识该方法为一个定时任务,通过 cron 参数来指定什么时候执行。
关于@Scheduled的参数配置可以参考SpringBoot 项目定时任务的启动和@Scheduled注解中的cron参数的设置原则-CSDN博客