标签:dia 注解 对象 batch 工作量 引导 伪造 web 框架 enc
@Entity
public class Employee {br/>@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;br/>@NotNull
private String firstName;br/>@NotNull
private String lastName;
// Standard constructor, getters and setters
}
注意,我们在实体定义中包含了自动生成的 id 。
现在我们必须为实体定义 JPA 存储库。这就是 Spring 使它变得非常简单的地方:
public interface EmployeeRepository
extends CrudRepository<Employee, Long> {
List<Employee> findAll();
}
我们所要做的就是定义一个这样的接口,Spring JPA 将为我们提供一个用默认和自定义操作充实的实现。相当整洁!在我们的其他文章中可以找到更多关于使用 Spring Data JPA的细节。
4.3. 控制器
现在我们必须定义一个网络控制器路由和处理我们的传入请求:
@RestController
public class EmployeeController {br/>@Autowired
private EmployeeRepository repository;br/>@GetMapping("/employees")
public List<Employee> getEmployees() {
return repository.findAll();
}
// Other CRUD endpoints handlers
}
实际上,我们所要做的就是对这个类使用注解并定义路由元信息以及每个处理程序方法。
4.4. 安全
所以现在我们已经定义了所有内容,但是如何保护创建或删除员工之类的操作呢?我们不希望对这些端点进行未经身份验证的访问!
Spring Security 在这方面非常出色:
这里有更多的细节需要注意理解,但最重要的一点是我们只允许 GET 操作不受限制的声明式方式。
4.5. 测试
现在我们已经做了所有的事情,但是等等,我们如何测试这个呢?
让我们看看 Spring 是否可以让编写 REST 控制器的单元测试变得更容易:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)br/>@AutoConfigureMockMvc
public class EmployeeControllerTests {br/>@Autowired
private MockMvc mvc;br/>@Test
@WithMockUser()
public void givenNoEmployee_whenCreateEmployee_thenEmployeeCreated() throws Exception {
mvc.perform(post("/employees").content(
new ObjectMapper().writeValueAsString(new Employee("First", "Last"))
.with(csrf()))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON))
.andExpect(MockMvcResultMatchers.status()
.isCreated())
.andExpect(jsonPath("$.firstName", is("First")))
.andExpect(jsonPath("$.lastName", is("Last")));
}
// other tests as necessary
}
4.6. 运行应用程序
最后,我们如何运行这个应用程序?这是 Spring Boot 的另一个有趣的方面。尽管我们可以将其打包为常规应用程序并传统上部署在 Servlet 容器上。
但这有什么好玩的!Spring Boot 附带一个嵌入式 Tomcat 服务器:br/>@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
这是一个预先创建的类,作为引导程序的一部分,具有使用嵌入式服务器启动此应用程序的所有必要细节。
此外,这是高度可定制的。
Spring 的替代品
虽然选择使用框架相对容易,但在框架之间进行选择通常会让我们的选择变得艰巨。 但为此,我们必须至少粗略地了解 Spring 提供的功能有哪些替代方案。
如前所述,Spring 框架及其项目为企业开发人员提供了广泛的选择。如果我们对当代 Java 框架做一个快速评估,它们甚至不能与 Spring 提供给我们的生态系统相提并论。
然而,对于特定的领域,它们确实形成了一个令人信服的论据来选择替代方案:
?Guice: 为 Java 应用程序提供一个健壮的 IoC 容器
?Play: 非常适合作为具有响应性支持的 Web 框架
?Hibernate: 一个基于 JPA 支持的数据访问框架
除了这些之外,还有一些新功能提供了比特定领域更广泛的支持,但仍然没有涵盖 Spring 必须提供的所有内容:
?Micronaut: 一个基于 JVM 的框架,针对云本地微服务而定制
?Quarkus: 一个新时代的 Java 栈,它承诺提供更快的启动时间和更小的内存占用
显然,完全迭代这个列表既不必要也不可行,但是我们在这里得到了广泛的概念。
6.1. 可用性
任何框架流行的一个关键方面是开发人员使用它是多么容易。Spring 通过多个配置选项和约定优于配置使开发人员可以轻松启动,然后准确配置他们需要的内容。
像?Spring Boot 这样的项目使得引导一个复杂的 Spring 项目变得非常简单。更不用说,它有优秀的文档和教程来帮助任何人入门。
6.2. 模块化
Spring 受欢迎的另一个关键方面是其高度模块化的特性。 我们可以选择使用整个 Spring 框架或仅使用必要的模块。 此外,我们可以根据需要选择包含一个或多个 Spring 项目。
而且,我们还可以选择使用 Hibernate 或 Struts 等其他框架!
6.3. 一致性
虽然 Spring?不支持所有 Java EE 规范,但它支持所有技术,通常在必要时提高对标准规范的支持。 例如,Spring 支持基于 JPA 的存储库,因此切换提供程序变得微不足道。
此外,Spring 支持行业规范,如 Spring Web Reactive 下的?Reactive Stream?和?Spring HATEOAS?下的 HATEOAS 。
6.4. 可测试性
采用任何框架在很大程度上还取决于测试构建在其上的应用程序是多么容易。 Spring 的核心是倡导并支持测试驱动开发(TDD)。
Spring 应用程序主要由 POJO 组成,这自然使单元测试相对简单得多。 但是,Spring 确实为 MVC 等场景提供了 Mock 对象,否则单元测试变得复杂。
6.5. 成熟
Spring 在创新、采用和标准化方面有着悠久的历史。多年来,它已经足够成熟,可以成为大型企业应用程序开发中最常见问题的默认解决方案。
更令人兴奋的是积极的开发和维护。每天都在开发对新语言特性和企业集成解决方案的支持。
6.6. 社区支持
最后但并非最不重要的是,任何框架甚至类库都通过创新在行业中生存下来,而且没有比社区更好的创新场所。 Spring 是由 Pivotal Software 领导的开源软件,由大型组织和个人开发者组成的支持。
这就意味着它仍然具有背景意义,而且往往具有未来主义色彩,这一点从它旗下项目的数量就可以明显看出。
标签:dia 注解 对象 batch 工作量 引导 伪造 web 框架 enc
原文地址:https://blog.51cto.com/14760318/2482863