Spring Framework 4.3 的核心容器改进

工程 | Stéphane Nicoll | 2016 年 3 月 4 日 | ...

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 接口的扩展,提供了一些便捷的签名,如 getIfAvailablegetIfUnique,用于仅在 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 bean
  • 支持 Common Annotations 1.1 的 javax.annotation.Resource.lookup()
  • @AliasFor 默认使用声明属性的名称
  • @PropertySource 声明提供自定义编码支持
  • SpEL 表达式的更广泛适用性(例如,在 @Scheduled 上)

Spring Framework 4.3.0.RC1 预计在三月下旬发布,GA 版本计划在五月底发布。如果您对这些功能感兴趣,请尽快尝试使用快照版本:最简单的方法是在 https://start.spring.io 上生成一个项目,使用 Spring Boot 1.4.0 (SNAPSHOT),这将带来当前的 Spring Framework 4.3 快照。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,助您加速进步。

了解更多

获得支持

Tanzu Spring 提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件,只需一份简单的订阅。

了解更多

即将举行的活动

查看 Spring 社区所有即将举行的活动。

查看所有