领先一步
VMware 提供培训和认证,助您加速进步。
了解更多Spring Framework 4.3.RC1 即将发布,带来了许多核心容器的改进,我们将在本文中一一探讨……
考虑以下服务类
@Service
public class FooService {
private final FooRepository repository;
@Autowired
public FooService(FooRepository repository) {
this.repository = repository
}
}
这是一个非常常见的用例,但如果您忘记在构造函数上添加 @Autowired 注解,容器将抛出异常,寻找一个默认构造函数,除非您在 bean 定义设置中(例如,在 XML <bean> 中)明确指示了自动装配模式为“constructor”。
因此,从 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 中的 Guava 支持。
还有一些其他的核心改进,其中一些是长期以来备受期待的
Collection/Map beanjavax.annotation.Resource.lookup()@AliasFor 默认使用声明属性的名称@PropertySource 声明提供自定义编码支持@Scheduled 上)Spring Framework 4.3.0.RC1 预计在三月下旬发布,GA 版本计划在五月底发布。如果您对这些功能感兴趣,请尽快尝试使用快照版本:最简单的方法是在 https://start.spring.io 上生成一个项目,使用 Spring Boot 1.4.0 (SNAPSHOT),这将带来当前的 Spring Framework 4.3 快照。