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`接口的扩展,具有方便的签名,例如`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 支持。

其他

还有许多其他核心改进,其中一些是长期以来一直需要的。

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

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

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

获得支持

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

了解更多信息

即将举行的活动

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

查看全部