范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

肝了一周总结的SpringBoot常用注解大全,看完就炉火纯青了!

  平时使用SpringBoot开发项目,少不了要使用到它的注解。这些注解让我们摆脱了繁琐的传统Spring XML配置,让我们开发项目更加高效,今天我们就来聊聊SpringBoot中常用的注解!  常用注解概览
  这里整理了一张SpringBoot常用注解的思维导图,本文主要讲解这些注解的用法。
  组件相关注解@Controller
  用于修饰MVC中controller 层的组件,SpringBoot中的组件扫描功能会识别到该注解,并为修饰的类实例化对象,通常与@RequestMapping 联用,当SpringMVC获取到请求时会转发到指定路径的方法进行处理。/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/admin") public class UmsAdminController {      }@Service
  用于修饰service 层的组件,service 层组件专注于系统业务逻辑的处理,同样会被组件扫描并生成实例化对象。/**  * @auther macrozheng  * @description 后台用户管理Service实现类  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Service public class UmsAdminServiceImpl implements UmsAdminService {      }@Repository
  用于修饰dao 层的组件,dao 层组件专注于系统数据的处理,例如数据库中的数据,同样会被组件扫描并生成实例化对象。/**  * @auther macrozheng  * @description 后台用户与角色关系管理自定义Dao  * @date 2018/10/8  * @github https://github.com/macrozheng  */ @Repository public interface UmsAdminRoleRelationDao {      }@Component
  用于修饰SpringBoot中的组件,会被组件扫描并生成实例化对象。@Controller 、@Service 、@Repository 都是特殊的组件注解。/**  * @auther macrozheng  * @description 取消订单消息的生产者组件  * @date 2018/9/14  * @github https://github.com/macrozheng  */ @Component public class CancelOrderSender {      }依赖注入注解@Autowired
  会根据对象的类型 自动注入依赖对象,默认要求注入对象实例必须存在,可以配置required=false 来注入不一定存在的对象。/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/admin") public class UmsAdminController {     @Autowired     private UmsAdminService adminService; }@Resource
  默认会根据对象的名称 自动注入依赖对象,如果想要根据类型进行注入,可以设置属性为type = UmsAdminService.class 。/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/admin") public class UmsAdminController {     @Autowired     @Resource(name = "umsAdminServiceImpl")     private UmsAdminService adminService; }@Qualifier
  当同一个对象有多个实例可以注入时,使用@Autowired 注解无法进行注入,这时可以使用@Qualifier 注解指定实例的名称进行精确注入。/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/admin") public class UmsAdminController {     @Autowired     @Qualifier("umsAdminServiceImpl")     private UmsAdminService adminService; }实例与生命周期相关注解@Bean
  用于修饰方法,标识该方法会创建一个Bean实例,并交给Spring容器来管理。/**  * @auther macrozheng  * @description RestTemplate相关配置  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Configuration public class RestTemplateConfig {     @Bean     public RestTemplate restTemplate(){         return new RestTemplate();     } }@Scope
  用于声明一个SpringBean 实例的作用域,作用域的范围有以下几种:singleton:单例模式,在Spring容器中该实例唯一,Spring默认的实例模式。 prototype:原型模式,每次使用实例都将重新创建。 request:在同一请求中使用相同的实例,不同请求重新创建。 session:在同一会话中使用相同的实例,不同会话重新创建。 /**  * @auther macrozheng  * @description RestTemplate相关配置  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Configuration public class RestTemplateConfig {     @Bean     @Scope("singleton")     public RestTemplate restTemplate(){         return new RestTemplate();     } }@Primary
  当同一个对象有多个实例时,优先选择该实例。/**  * @auther macrozheng  * @description Jackson相关配置,配置json不返回null的字段  * @date 2018/8/2  * @github https://github.com/macrozheng  */ @Configuration public class JacksonConfig {     @Bean     @Primary     @ConditionalOnMissingBean(ObjectMapper.class)     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {         ObjectMapper objectMapper = builder.createXmlMapper(false).build();         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);         return objectMapper;     } }@PostConstruct
  用于修饰方法,当对象实例被创建并且依赖注入完成后执行,可用于对象实例的初始化操作。@PreDestroy
  用于修饰方法,当对象实例将被Spring容器移除时执行,可用于对象实例持有资源的释放。@PostConstruct、@PreDestroy示例/**  * @auther macrozheng  * @description 动态权限数据源,用于获取动态权限规则  * @date 2020/2/7  * @github https://github.com/macrozheng  */ public class DynamicSecurityMetadataSource implements FilterInvocationSecurityMetadataSource {      private static Map configAttributeMap = null;     @Autowired     private DynamicSecurityService dynamicSecurityService;      @PostConstruct     public void loadDataSource() {         configAttributeMap = dynamicSecurityService.loadDataSource();     }      @PostConstruct     public void loadDataSource() {         configAttributeMap = dynamicSecurityService.loadDataSource();     }      @PreDestroy     public void clearDataSource() {         configAttributeMap.clear();         configAttributeMap = null;     } }SpringMVC相关注解@RequestMapping
  可用于将Web请求路径映射到处理类的方法上,当作用于类上时,可以统一类中所有方法的路由路径,当作用于方法上时,可单独指定方法的路由路径。
  method 属性可以指定请求的方式,如GET、POST、PUT、DELETE等。@RequestBody
  表示方法的请求参数为JSON格式,从Body中传入,将自动绑定到方法参数对象中。@ResponseBody
  表示方法将返回JSON格式的数据,会自动将返回的对象转化为JSON数据。@RequestParam
  用于接收请求参数,可以是如下三种形式:query param:GET请求拼接在地址里的参数。 form data:POST表单提交的参数。 multipart:文件上传请求的部分参数。 @PathVariable
  用于接收请求路径中的参数,常用于REST风格的API。@RequestPart
  用于接收文件上传中的文件参数,通常是multipart/form-data 形式传入的参数。/**  * @auther macrozheng  * @description MinIO对象存储管理Controller  * @date 2019/12/25  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/minio") public class MinioController {      @RequestMapping(value = "/upload", method = RequestMethod.POST)     @ResponseBody     public CommonResult upload(@RequestPart("file") MultipartFile file) {             //省略文件上传操作...             return CommonResult.success(minioUploadDto);     } }SpringMVC注解示例/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Controller @RequestMapping("/admin") public class UmsAdminController {      @RequestMapping(value = "/register", method = RequestMethod.POST)     @ResponseBody     public CommonResult register(@RequestBody UmsAdminParam umsAdminParam) {         UmsAdmin umsAdmin = adminService.register(umsAdminParam);         if (umsAdmin == null) {             return CommonResult.failed();         }         return CommonResult.success(umsAdmin);     }          @RequestMapping(value = "/list", method = RequestMethod.GET)     @ResponseBody     public CommonResult> list(@RequestParam(value = "keyword", required = false) String keyword,                                                    @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,                                                    @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {         List adminList = adminService.list(keyword, pageSize, pageNum);         return CommonResult.success(CommonPage.restPage(adminList));     }      @RequestMapping(value = "/{id}", method = RequestMethod.GET)     @ResponseBody     public CommonResult getItem(@PathVariable Long id) {         UmsAdmin admin = adminService.getItem(id);         return CommonResult.success(admin);     } }@RestController
  用于表示controller 层的组件,与@Controller 注解的不同在于,相当于在每个请求处理方法上都添加了@ResponseBody 注解,这些方法都将返回JSON格式数据。@GetMapping
  用于表示GET请求方法,等价于@RequestMapping(method = RequestMethod.GET) 。@PostMapping
  用于表示POST请求方法,等价于@RequestMapping(method = RequestMethod.POST) 。REST风格注解示例/**  * @auther macrozheng  * @description 后台用户管理Controller  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @RestController @RequestMapping("/admin") public class UmsAdminController {      @PostMapping("/register")     public CommonResult register(@RequestBody UmsAdminParam umsAdminParam) {         UmsAdmin umsAdmin = adminService.register(umsAdminParam);         if (umsAdmin == null) {             return CommonResult.failed();         }         return CommonResult.success(umsAdmin);     }      @GetMapping("/list")     public CommonResult> list(@RequestParam(value = "keyword", required = false) String keyword,                                                    @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,                                                    @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum) {         List adminList = adminService.list(keyword, pageSize, pageNum);         return CommonResult.success(CommonPage.restPage(adminList));     } }配置相关注解@Configuration
  用于声明一个Java形式的配置类,SpringBoot推荐使用Java配置,在该类中声明的Bean等配置将被SpringBoot的组件扫描功能扫描到。/**  * @auther macrozheng  * @description MyBatis相关配置  * @date 2019/4/8  * @github https://github.com/macrozheng  */ @Configuration @MapperScan({"com.macro.mall.mapper","com.macro.mall.dao"}) public class MyBatisConfig { }@EnableAutoConfiguration
  启用SpringBoot的自动化配置,会根据你在pom.xml 添加的依赖和application-dev.yml 中的配置自动创建你需要的配置。@Configuration @EnableAutoConfiguration public class AppConfig { }@ComponentScan
  启用SpringBoot的组件扫描功能,将自动装配和注入指定包下的Bean实例。@Configuration @ComponentScan({"xyz.erupt","com.macro.mall.tiny"}) public class EruptConfig { }@SpringBootApplication
  用于表示SpringBoot应用中的启动类,相当于@EnableAutoConfiguration 、@EnableAutoConfiguration 和@ComponentScan 三个注解的结合体。@SpringBootApplication public class MallTinyApplication {      public static void main(String[] args) {         SpringApplication.run(MallTinyApplication.class, args);     }  }@EnableCaching
  当添加Spring Data Redis依赖之后,可用该注解开启Spring基于注解的缓存管理功能。/**  * @auther macrozheng  * @description Redis配置类  * @date 2020/3/2  * @github https://github.com/macrozheng  */ @EnableCaching @Configuration public class RedisConfig extends BaseRedisConfig {  }@value
  用于注入在配置文件中配置好的属性,例如我们可以在application.yml 配置如下属性:jwt:   tokenHeader: Authorization #JWT存储的请求头   secret: mall-admin-secret #JWT加解密使用的密钥   expiration: 604800 #JWT的超期限时间(60*60*24*7)   tokenHead: "Bearer "  #JWT负载中拿到开头
  然后在Java类中就可以使用@Value 注入并进行使用了。public class JwtTokenUtil {     @Value("${jwt.secret}")     private String secret;     @Value("${jwt.expiration}")     private Long expiration;     @Value("${jwt.tokenHead}")     private String tokenHead; }@ConfigurationProperties
  用于批量注入外部配置,以对象的形式来导入指定前缀的配置,比如这里我们在application.yml 中指定了secure.ignored 为前缀的属性:secure:   ignored:     urls: #安全路径白名单       - /swagger-ui/       - /swagger-resources/**       - /**/v2/api-docs       - /**/*.html       - /**/*.js       - /**/*.css       - /**/*.png       - /**/*.map       - /favicon.ico       - /actuator/**       - /druid/**
  然后在Java类中定义一个urls 属性就可以导入配置文件中的属性了。/**  * @auther macrozheng  * @description SpringSecurity白名单资源路径配置  * @date 2018/11/5  * @github https://github.com/macrozheng  */ @Getter @Setter @Configuration @ConfigurationProperties(prefix = "secure.ignored") public class IgnoreUrlsConfig {      private List urls = new ArrayList<>();  }@Conditional
  用于表示当某个条件满足时,该组件或Bean将被Spring容器创建,下面是几个常用的条件注解。@ConditionalOnBean:当某个Bean存在时,配置生效。 @ConditionalOnMissingBean:当某个Bean不存在时,配置生效。 @ConditionalOnClass:当某个类在Classpath存在时,配置生效。 @ConditionalOnMissingClass:当某个类在Classpath不存在时,配置生效。 /**  * @auther macrozheng  * @description Jackson相关配置,配置json不返回null的字段  * @date 2018/8/2  * @github https://github.com/macrozheng  */ @Configuration public class JacksonConfig {     @Bean     @Primary     @ConditionalOnMissingBean(ObjectMapper.class)     public ObjectMapper jacksonObjectMapper(Jackson2ObjectMapperBuilder builder) {         ObjectMapper objectMapper = builder.createXmlMapper(false).build();         objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);         return objectMapper;     } }数据库事务相关注解@EnableTransactionManagement
  启用Spring基于注解的事务管理功能,需要和@Configuration 注解一起使用。/**  * @auther macrozheng  * @description MyBatis相关配置  * @date 2019/4/8  * @github https://github.com/macrozheng  */ @Configuration @EnableTransactionManagement @MapperScan({"com.macro.mall.mapper","com.macro.mall.dao"}) public class MyBatisConfig { }@Transactional
  表示方法和类需要开启事务,当作用与类上时,类中所有方法均会开启事务,当作用于方法上时,方法开启事务,方法上的注解无法被子类所继承。/**  * @auther macrozheng  * @description 前台订单管理Service  * @date 2018/8/30  * @github https://github.com/macrozheng  */ public interface OmsPortalOrderService {      /**      * 根据提交信息生成订单      */     @Transactional     Map generateOrder(OrderParam orderParam); }SpringSecurity相关注解@EnableWebSecurity
  启用SpringSecurity的Web功能。@EnableGlobalMethodSecurity
  启用SpringSecurity基于方法的安全功能,当我们使用@PreAuthorize 修饰接口方法时,需要有对应权限的用户才能访问。SpringSecurity配置示例/**  * @auther macrozheng  * @description SpringSecurity配置  * @date 2019/10/8  * @github https://github.com/macrozheng  */ @Configuration @EnableWebSecurity @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig{      }全局异常处理注解@ControllerAdvice
  常与@ExceptionHandler 注解一起使用,用于捕获全局异常,能作用于所有controller中。@ExceptionHandler
  修饰方法时,表示该方法为处理全局异常的方法。全局异常处理示例/**  * @auther macrozheng  * @description 全局异常处理  * @date 2020/2/27  * @github https://github.com/macrozheng  */ @ControllerAdvice public class GlobalExceptionHandler {      @ResponseBody     @ExceptionHandler(value = ApiException.class)     public CommonResult handle(ApiException e) {         if (e.getErrorCode() != null) {             return CommonResult.failed(e.getErrorCode());         }         return CommonResult.failed(e.getMessage());     } }AOP相关注解@Aspect
  用于定义切面,切面是通知和切点的结合,定义了何时、何地应用通知功能。@Before
  表示前置通知(Before),通知方法会在目标方法调用之前执行,通知描述了切面要完成的工作以及何时执行。@After
  表示后置通知(After),通知方法会在目标方法返回或抛出异常后执行。@AfterReturning
  表示返回通知(AfterReturning),通知方法会在目标方法返回后执行。@AfterThrowing
  表示异常通知(AfterThrowing),通知方法会在目标方法返回后执行。@Around
  表示环绕通知(Around),通知方法会将目标方法封装起来,在目标方法调用之前和之后执行自定义的行为。@Pointcut
  定义切点表达式,定义了通知功能被应用的范围。@Order
  用于定义组件的执行顺序,在AOP中指的是切面的执行顺序,value属性越低优先级越高。AOP相关示例/**  * @auther macrozheng  * @description 统一日志处理切面  * @date 2018/4/26  * @github https://github.com/macrozheng  */ @Aspect @Component @Order(1) public class WebLogAspect {     private static final Logger LOGGER = LoggerFactory.getLogger(WebLogAspect.class);      @Pointcut("execution(public * com.macro.mall.tiny.controller.*.*(..))")     public void webLog() {     }      @Before("webLog()")     public void doBefore(JoinPoint joinPoint) throws Throwable {     }      @AfterReturning(value = "webLog()", returning = "ret")     public void doAfterReturning(Object ret) throws Throwable {     }      @Around("webLog()")     public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable {         WebLog webLog = new WebLog();         //省略日志处理操作...         Object result = joinPoint.proceed();         LOGGER.info("{}", JSONUtil.parse(webLog));         return result;     }      }测试相关注解@SpringBootTest
  用于指定测试类启用Spring Boot Test功能,默认会提供Mock环境。@Test
  指定方法为测试方法。测试示例/**  * @auther macrozheng  * @description JUnit基本测试  * @date 2022/10/11  * @github https://github.com/macrozheng  */ @SpringBootTest public class FirstTest {     @Test     public void test() {         int a=1;         Assertions.assertEquals(1,a);     } }总结
  这些SpringBoot注解基本都是我平时做项目常用的注解,在我的电商实战项目mall中基本都用到了,这里做了一番整理归纳,希望对大家有所帮助!

拿着回内地的机票被拦住,想离开香港没那么容易早在6月的时候,我就买好了9月底香港回内地的机票。那时候在网站上看香港飞内地的机票,只有从两个月后的9月中旬开始才有。想买7月或者8月的票?不好意思,想都不要想。疫情开始,买个机票鸡姓宝爸喜得三胞胎,死活不愿孩子跟自己姓,幸亏宝妈聪明鸡姓宝爸喜得三胞胎死活不愿孩子跟自己姓,幸亏宝妈聪明01hr中国有句俗话人如其名而在很多中国人的观念里,一个人的名字不仅寄托着父母对孩子的祝福和厚望甚至还会关系一个孩子一生的命运祸这套相见恨晚的科普童书,讲解科普不枯燥,解惑还能保留探索精神孩子最可贵的是什么?可能不同的人有不同的答案。在我看来,孩子如果能保有好奇心的同时,保持可贵的童心和探索精神,是我最希望的。所以,虽然我家娃是一个5岁的科普直男,但是我一直希望他阅三种坐月子方式日趋流行,各有什么优缺点,该怎么选择要清楚文菁妈01hr以前我们说嫁鸡随鸡,嫁狗随狗,而结婚之后都是住在婆婆家,生孩子自然是婆婆来照顾!但是现在生活发生了翻天覆地的变化,很多时候婆婆和媳妇并不是住在一起的!但是很多时候媳妇嫁给世界首富比尔盖茨,MBA高材生甘当27年家庭主妇,她后悔过吗?每一年,全球最大的公益基金会比尔与梅琳达盖茨基金会,都会对外发表一封公开信,分享比尔盖茨和梅琳达这对夫妻楷模的公益心得。但2021年不只有公开信,5月4日这一天,比尔盖茨发推宣布,1958年,这位开国大将出任总参谋长,为何不到一年就被免职了?总参谋长一职,是建国后我军总部极其重要的领导职位,先后由徐帅聂帅(代理)粟司令等著名将帅出任,皆是军事素养与军内威望非常高的人物。1958年上任的总参谋长也是一位开国大将,然而只干孕中期开始,孕妇会有这种反应,稍不留神就容易影响到腹中胎儿怀孕以后或多或少会陆续出现一些反应,不同的孕妈孕反应的严重程度也有所不同,孕反应当属孕早期的孕吐最为强烈,有些孕妈甚至严重到吃不下饭,但是也有不少孕妈并没有太过于强烈的反应,整个孕不背单词就能进阶?猿辅导分享前沿英语学习法对很多孩子来说,单词记忆和积累是英语启蒙路上的一个大难题。辨析单词难记忆拼写难,扩充词汇量更是大难题!其实,单词不是靠背的,孩子没有掌握正确科学的方法,难怪单词记不住词汇量难以扩大瑞昌五幼开展迎国庆系列主题活动九江新闻网讯(占佳佳)为让幼儿感受节日氛围,培养爱国情感,近日,瑞昌市第五幼儿园开展一系列丰富多彩的国庆节庆祝活动。活动中,各班教师向幼儿讲解了国旗国徽国庆节的含义及由来,并通过图我老了不指望孩子养老这样想的父母看似伟大,其实很愚蠢文文儿以前上学的时候,课本上关于孝道的说法,都是父母养大孩子不容易,作为儿女长大要孝顺父母,让父母度过一个安详的晚年。人生最美好的传承就是我养你大,你养我老,这也是生孩子的意义。可孩子近视了怎么办?针对近视,目前我们常见的防控方法有这么几种,第一每天两小时的户外活动第二低浓度阿托品第三角膜塑形镜第四离焦框架眼镜。(图片来源腾讯医典)第一,当下,孩子课业压力非常重,每天两个小时
不俗套的小年祝福语1值此别旧迎新之际,请允许我以千年青松为笔,万里河山为墨,湛蓝天空为宣,添以梅之风华,牡丹之妖娆,雏菊之清新,着一幅猪年万寿无疆图。以贺小年之喜。2小年是个筐,祝福往里装,送你一个如果说过去一年我学会了什么,那就是逃避虽然可耻但有用Hi大家好,我是花时间。今天和大家聊聊天。慢成长的老读者可能会察觉,12月份的时候,我露面少了。原因是,我请了个假。如果撑不下去,可以适当逃离今年9月的时候,我写了一篇疫情时代下一88分钟绝杀,21逆转!泰山卫冕足协杯3连冠,曝夺冠奖金1000万2022赛季中国足协杯决赛在苏州正式打响,山东泰山21逆转浙江队,实现足协杯3连冠,同时队史第8次捧杯,继续刷新历史纪录,现场2。2万球迷见证。半决赛阶段,山东泰山淘汰上海申花,浙周迅受聘杭州亚运会宣传形象大使出演MV最美的风景周迅(左)受聘成为杭州亚运会宣传形象大使。杭州亚组委供图中新网杭州1月15日电(钱晨菲)15日,记者从杭州亚组委获悉,演员周迅受聘成为杭州2022年亚运会(下称杭州亚运会)宣传形象中国全面重开,澳旅行业急盼中国游客回归!过去三年最好的消息!据悉尼晨锋报1月14日报道,在中国取消清零政策并重新开放经济后,旅游运营商旅行社和中国航空公司正在为大批游客重返澳洲做准备。澳洲知名旅行社FlightCentre的全球航空主管Gr风电轴承行业深度分析轴承属于机械工业中机械基础件基础制造工艺和基础材料产业三基之一,应用范围十分广泛且市场需求旺盛,属于附加值较高环节目前国内高端轴承市场发展较慢且市场集中度较低,以生产微型与小型轴承速来了解!2022深圳马拉松竞赛规程出炉来源读特1月15日,深圳马拉松官方微信公众号发布2022深圳马拉松竞赛规程。详情如下一认证单位中国田径协会二主办单位深圳市人民政府三承办单位深圳市文化广电旅游体育局深圳市投资控股有云南西双版纳游客大幅增长旅游业快速回暖央视网消息冬季是云南西双版纳的旅游旺季,进入新年以来,越来越多的游客从各地赶往西双版纳,各景区的游客相比同期都呈现大幅度的增长。新年以来,云南西双版纳野象谷森林公园等景区迎来了络绎雷丁汽车创始人实名举报县委书记新春聊聊车昨晚,新能源车圈一封举报信刷屏了,雷丁汽车创始人李国欣实名举报潍坊市昌乐县现任县委书记王骁一把手霸权。举报视频截图李国欣在举报信中称,2022年雷丁汽集团在当地共计上报工网约车低价单将成为历史,监管部门开启约谈模式,老司机都说好如果说网约车司机最痛恨什么,那一定是那些低价单一口价单和优惠单了。平台给乘客优惠,最后却由司机买单。平台赚了流量,司机却日日亏损,但现在司机朋友们可以拍手叫好了,因为有关部门已经介比亚迪2022年比亚迪汽车销售1868543,全年同比增长152。5,牛畅聊数码新品现在国内的新能源汽车市场,跟手机市场挺像的,手机市场是iphonevs华米OV其他,新能源汽车市场是特斯拉iconvs比亚迪,埃安,小鹏,蔚来,理想等等,手机市场高端货