领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多信息Spring Framework 4.3.RC1 即将发布,它带来了不错的核心容器改进,我们将在本文中探讨这些改进……
考虑以下服务类
@Service
public class FooService {
private final FooRepository repository;
@Autowired
public FooService(FooRepository repository) {
this.repository = repository
}
}
这是一个相当常见的用例,但是如果您忘记在构造函数上使用`@Autowired`注解,容器将抛出异常,因为它正在寻找默认构造函数,除非您在 bean 定义设置中显式指定 autowire 模式为“constructor”(例如,在 XML 的`<bean>`中)。
因此,从 4.3 版本开始,在这种单构造函数场景中,您不再需要指定显式注入注解。这对于那些根本不包含任何容器注解的类来说尤其优雅,例如,在以编程方式注册时。
public class FooService {
private final FooRepository repository;
public FooService(FooRepository repository) {
this.repository = repository
}
}
同样,您可能已经注意到,`@Configuration`类历史上不支持构造函数注入。从 4.3 版本开始,它们现在支持了,并且它们显然也允许在单构造函数场景中省略`@Autowired`……
@Configuration
public class FooConfiguration {
private final FooRepository repository;
public FooConfiguration(FooRepository repository) {
this.repository = repository
}
@Bean
public FooService fooService() {
return new FooService(this.repository);
}
}
Spring Framework 4.3 还引入了`ObjectProvider`,它是现有`ObjectFactory`接口的扩展,具有方便的签名,例如`getIfAvailable`和`getIfUnique`,仅当 bean 实际存在(可选支持)或可以确定单个候选者(特别是:在多个匹配 bean 的情况下为主要候选者)时才检索 bean。
@Service
public class FooService {
private final FooRepository repository;
public FooService(ObjectProvider<FooRepository> repositoryProvider) {
this.repository = repositoryProvider.getIfUnique();
}
}
您可以将此类`ObjectProvider`句柄用于初始化期间的自定义解析目的,或者将句柄存储在字段中以进行以后按需解析(就像您通常使用`ObjectFactory`一样)。
缓存抽象主要用于缓存 CPU 和/或 IO 密集型操作的值。在某些用例中,多个线程(即客户端)可能会并行请求给定的键,尤其是在启动时。同步缓存支持是一个长期以来被请求的功能,现在已经实现了。假设以下情况:
@Service
public class FooService {
@Cacheable(cacheNames = "foos", sync = true)
public Foo getFoo(String id) { ... }
}
请注意`sync = true`属性,它告诉框架在计算值时阻塞任何并发线程。这将确保在并发访问的情况下,此密集型操作仅调用一次。
顺便说一句,Spring Framework 4.3 现在支持Caffeine,这是一个 Guava 缓存的 Java 8 重写版本,旨在取代 Spring Framework 5 中 Spring 的 Guava 支持。
还有许多其他核心改进,其中一些是长期以来一直需要的。
Spring Framework `4.3.0.RC1` 预计将于 3 月下旬发布,GA 预计将于 5 月底发布。如果您对这些功能感兴趣,请尽早尝试使用快照:最简单的方法是使用 Spring Boot `1.4.0 (SNAPSHOT)` 在https://start.spring.io上生成项目,它将附带当前的 Spring Framework 4.3 快照。