springboot基本项目结构和常用的注解简单使用方法

简介: springboot

1. 项目结构

1.1 结构图

1.2 介绍

  • src
  • main
  • java
  • com.cheng.ai 包名
  • controller 控制层
  • service 服务层
  • mapper dao层
  • entity 实体类文件夹
  • rescources
  • application.yaml
  • templates
  • test 测试文件包

大体可以分为上面这种结构,控制层主要写跟前端交互的代码,服务层主要写业务代码供控制层调用,dao层写操作数据库的代码供服务层调用,实体类主要写数据库表对应的关系模型,将数据库中数据和代码关联供dao层调用

  • 这些文件结构以及关系是

控制层------>服务层------->dao层-------->实体类,一层层调用。

1.3 为什么要这样分

  • 假设我们做一个商城程序
  • 需要查询商品的列表
  • 需要返回一个商品列表的数据

那么按照一个文件写,我把控制层、服务层等写在一个文件里面,这样就可以让项目结构清晰简单了。

但是随之而来的问题,你的这个查询商品列表的业务要是太复杂了,可能整个流程写下来有几百上千行代码了,而且代码依赖性太强了,突然有个地方出了bug你找出来麻烦,就算很简单找出来,但是前面代码一动后面代码万一全跟着错了怎么办,这改下来不得掉一斤头发,万一改好一个又一个怎么办,为了避免这样的事情出现所以分文件写,错了也不会导致这样雪崩式的错误出现。


      但是还有人杠,我写的代码不可能有错的,好!代码没有错,万一要是前端要你把接口改一下呢,数据库表有点细微的变化呢、返回的数据要你改改呢。我知道你没有错,但是这还是得改,总不可能把他们打了说不改吧。所以这样一改,还是会导致各种问题出现。

你以多文件的方式去暴露方法接口,就算你某个层要修改也仅仅只是某个层的代码要改,不会影响其他层的代码,其他层只是调用了方法并不关心内部代码如何,这样使代码大大解耦合,使可用性更高。

2. 常用注解

2.1 程序启动 @SpringBootApplication

@SpringBootApplication// 将此类标记为程序启动类,程序将从此进入启动publicclassAiApplication {
publicstaticvoidmain(String[] args) {
SpringApplication.run(AiApplication.class, args);
    }
}

2.2 配置类 @Configuration

@Configuration// 将此文件标记为配置类,跟随程序启动加载@MapperScan({"com.cheng.ai.mapper"}) // 后面mybatis一起讲publicclassMybatisConfig {
}

2.3@component、@Service、@Controller、@Respository

  • 这几个注解功能基本上一样,用在不同的地方

注解

说明

@Component

普通实体注入spring容器

@Repository

dao层注入spring容器

@Service

服务层注入spring容器

@Controller

控制层注入spring容器

在前后端分离项目中一般使用@RestController代替@Controller,因为@RestController包含了@Controller等注解,以下是他的代码

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented@Controller@ResponseBodypublic@interfaceRestController {
@AliasFor(
annotation=Controller.class    )
Stringvalue() default"";
}

2.4 @ResponseBody

@ResponseBody可以作用在方法上或类上,表示该方法的返回结果直接写入 HTTP response body 中,而不会被解析为跳转路径,即不会经过视图解析器,返回什么数据即在页面输入什么数据。下面是@ResponseBody注解源码

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic@interfaceResponseBody {
}

2.5 @Autowired

此注解会自动在spring容器中找到bean进行自动装配,如果发现找到多个bean,则按照name方式比对,如果还有多个,则报出异常

@Service// 在实现类注入publicclassAiLogServiceImplextendsServiceImpl<AiLogMapper, AiLog>implementsAiLogService {
}
@RestController@RequestMapping("/aiLog")
publicclassAiLogController {
@AutowiredprivateAiLogServiceaiLogService; // 装配@GetMapping("test")
publicCommonResultgetlist(){
List<AiLog>list=aiLogService.list();
returnCommonResult.success(list);
    }
}

2.6 @RequestMapping、@GetMapping、@PostMapping......

这些注解定义请求的url,@RequestMapping可以用在类上或者方法上

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented@Mappingpublic@interfaceRequestMapping {
    ......
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented@RequestMapping(
method= {RequestMethod.POST}
)
public@interfacePostMapping{
    ......
}

可以看到PostMapping仅仅只是RequestMapping限定methon(请求方法的注解),并且只可以用于方法上,PostMapping限定的请求只能以POST方式,GetMapping限定GET方式请求,其他XXXMapping就是限定XXX请求方式

2.7 @Value

可以注入在配置文件中的值到实体类,注意此类要加入到sping容器此注解才有效

2.8 @Bean

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic@interfaceBean {
    ......
}

作用于方法上,将方法的返回值注入到spring容器中

@Configuration@EnableSwagger2WebMvcpublicclassSwaggerConfig {
// 创建Docket存入容器,Docket代表一个接口文档@BeanpublicDocketwebApiConfig(){
returnnewDocket(DocumentationType.SWAGGER_2)
// 创建接口文档的具体信息                .apiInfo(webApiInfo())
// 创建选择器,控制哪些接口被加入文档                .select()
// 指定@ApiOperation标注的接口被加入文档                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .build();
    }
}

2.9@RequestParam@RequestBody@PathVariable@RequestHeader、@CookieValue

这些注解用来接收前端参数的

@ResquestParam

get请求获取参数的注解

@PathVariable

获取路径参数

@ResquestHeader

获取请求头的信息

@CookieValue

获取Cookie的信息

示例:

@GetMapping("/list/{pageNum}/{pageSize}")
publicCommonResult<List<Brand>>getList(@PathVariable("pageNum") intpageNum,
@PathVariable("pageSize") intpageSize){
        ......
    }


相关文章
|
7月前
|
XML Java 测试技术
Spring IOC—基于注解配置和管理Bean 万字详解(通俗易懂)
Spring 第三节 IOC——基于注解配置和管理Bean 万字详解!
493 26
|
4月前
|
人工智能 前端开发 JavaScript
SpringBoot实现网页消息推送的5种方法
本文详细介绍了在SpringBoot中实现网页消息推送的几种主流方案,包括短轮询、长轮询、SSE(Server-Sent Events)、WebSocket以及STOMP。每种方案各有优缺点,适用于不同的场景需求。短轮询简单易实现但效率低;长轮询提升了实时性但仍有限制;SSE适合单向通信且轻量高效;WebSocket支持全双工通信,适合高实时性要求的场景;STOMP基于WebSocket,提供更高级的消息传递功能。通过对比分析,开发者可根据业务需求、性能要求及浏览器兼容性选择最适合的技术方案,同时可结合多种技术实现优雅降级,优化用户体验。
865 57
|
3月前
|
SQL JSON 前端开发
较为完整的SpringBoot项目结构
本文介绍了SpringBoot项目的分层结构与目录组成。项目分为四层:**controller层**(前端交互)、**service层**(业务逻辑处理)、**dao层**(数据库操作)和**model层**(实体类定义)。分层设计旨在实现关注点分离,降低耦合度,提高系统灵活性、可维护性和扩展性。此外,还详细说明了项目目录结构,包括`controller`、`service`、`dao`、`entity`、`param`、`util`等子目录的功能划分,便于团队协作开发。此架构有助于前后端分离,明确各模块职责,符合高内聚低耦合的设计原则。
2001 1
|
3月前
|
Java 测试技术 数据库
说一说 SpringBoot 整合 Junit5 常用注解
我是小假 期待与你的下一次相遇 ~
|
8月前
|
缓存 Java 数据库
SpringBoot缓存注解使用
Spring Boot 提供了一套方便的缓存注解,用于简化缓存管理。通过 `@Cacheable`、`@CachePut`、`@CacheEvict` 和 `@Caching` 等注解,开发者可以轻松地实现方法级别的缓存操作,从而提升应用的性能和响应速度。合理使用这些注解可以大大减少数据库的访问频率,优化系统性能。
478 89
|
5月前
|
缓存 安全 Java
深入解析HTTP请求方法:Spring Boot实战与最佳实践
这篇博客结合了HTTP规范、Spring Boot实现和实际工程经验,通过代码示例、对比表格和架构图等方式,系统性地讲解了不同HTTP方法的应用场景和最佳实践。
513 5
|
5月前
|
Java Spring 容器
两种Spring Boot 项目启动自动执行方法的实现方式
在Spring Boot项目启动后执行特定代码的实际应用场景中,可通过实现`ApplicationRunner`或`CommandLineRunner`接口完成初始化操作,如系统常量或配置加载。两者均支持通过`@Order`注解控制执行顺序,值越小优先级越高。区别在于参数接收方式:`CommandLineRunner`使用字符串数组,而`ApplicationRunner`采用`ApplicationArguments`对象。注意,`@Order`仅影响Bean执行顺序,不影响加载顺序。
431 2
|
6月前
|
JSON 前端开发 Java
Spring MVC常用的注解
@RequestMapping:用于处理请求 url 映射的注解,可用于类或方法上。用于类上,则表示类中 的所有响应请求的方法都是以该地址作为父路径。 @RequestBody:注解实现接收http请求的json数据,将json转换为java对象。 @ResponseBody:注解实现将conreoller方法返回对象转化为json对象响应给客户。 @Controller:控制器的注解,表示是表现层,不能用用别的注解代替 @RestController : 组合注解 @Conntroller + @ResponseBody @GetMapping , @PostMapping , @Put
|
6月前
|
Java Spring
Spring Boot的核心注解是哪个?他由哪几个注解组成的?
Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 : ● @SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能; ● @EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项 ● @ComponentScan:Spring组件扫描
|
6月前
|
Java 测试技术 Spring
SpringBoot+@Async注解一起用,速度提升
本文介绍了异步调用在高并发Web应用性能优化中的重要性,对比了同步与异步调用的区别。同步调用按顺序执行,每一步需等待上一步完成;而异步调用无需等待,可提升效率。通过Spring Boot示例,使用@Async注解实现异步任务,并借助Future对象处理异步回调,有效减少程序运行时间。
175 3