大家好我是易安,本篇文章我将向你展现如何应用 Lombok 来实现 Spring 框架中的最佳实际。
Spring 框架自身提供了各种不同的办法来执行依赖注入。选项的灵活性是 Spring 框架的劣势之一。然而,并非所有的依赖注入选项都被认为是最佳实际。有些选项实际上十分蹩脚。
依赖注入示例
我设置了一些示例,以便咱们审查能够应用的不同依赖注入选项。
让咱们应用一个示例 Spring 服务。对于咱们的目标,该服务具备返回字符串的一个办法。咱们将应用 Spring 将咱们的“服务”注入到一些伪控制器中。请记住,咱们只是摸索如何应用 Spring 框架进行依赖注入。
示例服务
@Service
public class MyService {public String getHello(){return "Hello";}
}
咱们的字段控制器有一个公共属性来保留该服务。咱们能够正文此字段,Spring 将注入服务实例。
属性注入
@Controller
public class FieldController {
@Autowired
MyService myService;
public String saySomething(){return myService.getHello();
}
}
这只是一个公共属性,没有 setter。很显著,这不是一个好习惯。也不是举荐的办法。
咱们能够略微改良一下,使字段拜访变为公有的。Spring 框架容许您主动拆卸公有字段。你的确会看到有人这样做。Spring 会执行一些反射操作来实现依赖注入。
私有化
@Controller
public class PrivateFieldController {
@Autowired
private MyService myService;
public String saySomething(){return myService.getHello();
}
}
尽管比仅应用公有字段好,但测试会变得麻烦。您要么须要启动 Spring 上下文,要么应用一些 Spring 实用程序来执行测试的依赖注入。尽管不是世界末日,但通常很烦人。
咱们能够通过为公有属性提供 setter 办法来改良这一点。在面向对象编程中,Getter 和 Setter 通常被视为最佳实际。通过对 setter 办法进行正文,能够轻松地批示 Spring 应用 setter 进行依赖注入。
办法注入
Setter 控制器
@Controller
public class SetterController {
private MyService myService;
@Autowired
public void setMyService(MyService myService) {this.myService = myService;}
public String saySomething(){return myService.getHello();
}
}
这比应用公有字段要好得多。有人会埋怨这是要写太多代码了
依赖注入最佳实际
依赖注入的最佳实际是利用接口、构造函数和 final 属性。
我曾经设置了一个“最佳实际”服务接口,并提供了一个带有 Spring Service 正文的服务实现。
最佳实际服务接口
public interface BpService {String getHello();
}
最佳实际服务实现
@Service
public class BpServiceImpl implements BpService {
@Override
public String getHello() {return "The Best Hello!";}
}
应用 Project Lombok
当初,应用 Lombok 实现依赖注入的最佳实际,咱们须要:
- 申明一个接口类型的 final 属性
- 应用 Project Lombok 的
@RequiredArgsConstructor
正文标注类
当初,Project Lombok 将为所有申明为 final 的属性生成构造函数。Spring 将主动应用 Lombok 提供的构造函数进行主动拆卸。
Lombok 控制器
@RequiredArgsConstructor
@Controller
public class BpFinalConstructorController {
private final BpService bpService;
public String saySomething(){return bpService.getHello();
}
}
这是一种十分不错的形式。您的代码会放弃十分洁净。在应用 Spring 时,通常须要多个主动拆卸的属性。
当您须要增加另一个 bean 时,只需申明一个 final 属性即可。
如果您进行了重构,不再须要一个由 Spring 治理的依赖项,只需删除 final 属性即可。
您不再须要保护 setter 或构造函数代码。Lombok 为您解决这个干燥的工作。
我在日常编码中曾经应用这种技术一段时间了。它的确节俭了很多工夫,并使代码更加清晰。不再存在未应用的属性和未应用的结构函数参数。当初重构就少了一些苦楚!
本文由 mdnice 多平台公布