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 定义设置中明确指定 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 接口的扩展,它具有方便的签名,例如 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 中的 Spring 的 Guava 支持。

其他

还有很多其他的核心改进,其中一些是长期渴望的

  • 注入自引用和泛型类型 Collection/Map bean
  • 支持 Common Annotations 1.1 的 javax.annotation.Resource.lookup()
  • @AliasFor 默认为声明属性的名称
  • 自定义编码支持 @PropertySource 声明
  • 更广泛的 SpEL 表达式适用性(例如,在 @Scheduled 上)

Spring Framework 4.3.0.RC1 预计于 3 月底发布,GA 计划于 5 月底发布。如果您对这些功能感兴趣,请尽早使用快照试用:最简单的方法是在 https://start.spring.io 上使用 Spring Boot 1.4.0 (SNAPSHOT) 生成一个项目,其中包含当前的 Spring Framework 4.3 快照。

获取 Spring 新闻通讯

保持与 Spring 新闻通讯的联系

订阅

领先一步

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

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

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

查看全部