Spring Boot直观特点

  1. 使用自动配置
    Spring Boot 的一个主要特性是使用自动配置。这是 Spring Boot 的一部分,它可以简化你的代码并使之工作。当在类路径上检测到特定的 jar 文件时,自动配置就会被激活。使用它的最简单方法是依赖 Spring Boot Starters。因此,如果你想与 Redis 进行集成,你可以首先包括:
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果你想与 MongoDB 进行集成,需要这样

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

借助于这些 starters,这些繁琐的配置就可以很好地集成起来并协同工作,而且它们都是经过测试和验证的。这非常有助于避免可怕的 Jar 地狱。
通过使用以下注解属性,可以从自动配置中排除某些配置类,但很少用

@EnableAutoConfiguration(exclude = {ClassNotToAutoconfigure.class}
  1. 保持 @Controller 的简洁和专注
    Controller 应该非常简单。你可以在此处阅读有关 GRASP 中有关控制器模式部分的说明。你希望控制器作为协调和委派的角色,而不是执行实际的业务逻辑。以下是主要做法:
    https://en.wikipedia.org/wiki/GRASP_(object-oriented_design)#Controller 控制器应该是无状态的!默认情况下,控制器是单例,并且任何状态都可能导致大量问题;
    控制器不应该执行业务逻辑,而是依赖委托;
    控制器应该处理应用程序的 HTTP 层,这不应该传递给服务;
    控制器应该围绕用例 / 业务能力来设计。
    要深入这个内容,需要进一步地了解设计 REST API 的最佳实践。
    无论你是否想要使用 Spring Boot,都是值得学习的。

3.围绕业务功能构建 @Service
Service 是 Spring Boot 的另一个核心概念。我发现最好围绕业务功能 / 领域 / 用例(无论你怎么称呼都行)来构建服务。

在应用中设计名称类似AccountService, UserService, PaymentService这样的服务,比起像DatabaseService、ValidationService、CalculationService这样的会更合适一些。

你可以决定使用 Controler 和 Service 之间的一对一映射,那将是理想的情况。但这并不意味着,Service 之间不能互相调用!
4.使数据库独立于核心业务逻辑之外
你希望你的数据库逻辑于服务分离出来。理想情况下,你不希望服务知道它正在与哪个数据库通信,这需要一些抽象来封装对象的持久性。
5.保持业务逻辑不受 Spring Boot 代码的影响
尽量分成各个服务,通常成为库。这将保持你的业务逻辑可重用。
6.推荐使用构造函数注入
保持业务逻辑免受 Spring Boot 代码侵入的一种方法是使用构造函数注入。不仅是因为@Autowired注解在构造函数上是可选的,而且还可以在没有 Spring 的情况下轻松实例化 bean。
7.熟悉并发模型
在 Spring Boot 中,Controller 和 Service 是默认是单例。如果你不小心,这会引入可能的并发问题。你通常也在处理有限的线程池。一般用threadlocal解决,注意要及时释放。
8.加强配置管理的外部化
这一点超出了 Spring Boot,虽然这是人们开始创建多个类似服务时常见的问题……
你可以手动处理 Spring 应用程序的配置。如果你正在处理多个 Spring Boot 应用程序,则需要使配置管理能力更加强大。
我推荐两种主要方法:
使用配置服务器,例如 Spring Cloud Config;
将所有配置存储在环境变量中(可以基于 git 仓库进行配置)。
这些选项中的任何一个(第二个选项多一些)都要求你在 DevOps 更少工作量,但这在微服务领域是很常见的。
9.提供全局异常处理
你真的需要一种处理异常的一致方法。Spring Boot 提供了两种主要方法:
你应该使用 HandlerExceptionResolver 定义全局异常处理策略;
你也可以在控制器上添加 @ExceptionHandler 注解,这在某些特定场景下使用可能会很有用。
不过也可以跟下面一样,在controller阶段抛出,捕获异常,输出到前段处理,显示。

//菜品上架
    @RequestMapping("/on_sale")
    public String onSale(@RequestParam("foodId") int foodId,
                         ModelMap map) {
        try {
            Food food = foodRepository.findById(foodId).orElse(null);
            if (food == null) {
                throw new DianCanException(ResultEnum.PRODUCT_NOT_EXIST);
            }
            if (food.getFoodStatusEnum() == FoodStatusEnum.UP) {
                throw new DianCanException(ResultEnum.PRODUCT_STATUS_ERROR);
            }
            food.setFoodStatus(FoodStatusEnum.UP.getCode());
            foodRepository.save(food);
        } catch (DianCanException e) {
            map.put("msg", e.getMessage());
            map.put("url", "/diancan/food/list");
            return "zujian/error";
        }

        map.put("url", "/diancan/food/list");
        return "zujian/success";
    }

10.使用日志框架
你可能已经意识到这一点,但你应该使用 Logger 进行日志记录,而不是使用 System.out.println() 手动执行。这很容易在 Spring Boot 中完成,几乎没有配置。只需获取该类的记录器实例:
Logger logger = LoggerFactory.getLogger(MyClass.class); 这很重要,因为它可以让你根据需要设置不同的日志记录级别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值