Bootstrap

Spring 5 中文解析核心篇-IoC容器之JSR330标准注解

1.11 使用JSR330标准注解

Spring3.0开始,Spring提供对JSR-330标准注解的支持(依赖注入)。这些注解和Spring注解一样的方式被扫描。去使用它们,你需要在类路径中依赖相关的jar包。

如果你使用Maven,javax.inject组件在标准的Maven仓库中()是有效的。你可以添加下面的依赖到你的pom.xml:


 javax.inject
 javax.inject
 1

1.11.1 依赖注入

你可以使用替代,类似下面例子:

import javax.inject.Inject;

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.findMovies(...);
        // ...
    }
}

类似注解,你可以在字段级别、方法级别、构造参数级别使用。此外,你可以将注入点声明为,从而允许按需访问范围较短的bean,或者通过提供程序调用对其他bean进行延迟访问。下面例子提供前面子例子变体:

import javax.inject.Inject;
import javax.inject.Provider;

public class SimpleMovieLister {

    private Provider movieFinder;

    @Inject
    public void setMovieFinder(Provider movieFinder) {
        this.movieFinder = movieFinder;
    }

    public void listMovies() {
        this.movieFinder.get().findMovies(...);
        // ...
    }
}

如果你喜欢为应该被注入的依赖使用限定名称,你应该使用注解,类似下面的例子显示:

import javax.inject.Inject;
import javax.inject.Named;

public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(@Named("main") MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

类似,也能使用或。这在这里更适用,因为没有属性。下面两个例子展示怎样去使用和:

public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(Optional movieFinder) {
        // ...
    }
}

public class SimpleMovieLister {

    @Inject
    public void setMovieFinder(@Nullable MovieFinder movieFinder) {
        // ...
    }
}

参考代码:

1.11.2 :等价于

代替,你可以使用或,类似下面的例子:

import javax.inject.Inject;
import javax.inject.Named;

@Named("movieListener")  // @ManagedBean("movieListener") could be used as well
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

在没有指定组件名称的情况下使用是非常常见的。可以类似的方式使用,类似下面例子:

import javax.inject.Inject;
import javax.inject.Named;

@Named
public class SimpleMovieLister {

    private MovieFinder movieFinder;

    @Inject
    public void setMovieFinder(MovieFinder movieFinder) {
        this.movieFinder = movieFinder;
    }

    // ...
}

使用或时,可以使用与使用Spring注解完全相同的方式来使用组件件扫描。类似下面例子展示:

@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    // ...
}

与相比,JSR330和JSR-250 注解是不能被组合的。你应该使用Spring的构造型模型来构建自定义组件注解。

参考代码:

1.11.3 JSR-330标准注解的限制

当你使用标准注解时,你应该知道一些重要特性不可用,类似下面表格展示:

作者

个人从事金融行业,就职过易极付、思建科技、某网约车平台等重庆一流技术团队,目前就职于某银行负责统一支付系统建设。自身对金融行业有强烈的爱好。同时也实践大数据、数据存储、自动化集成和部署、分布式微服务、响应式编程、人工智能等领域。同时也热衷于技术分享创立公众号和博客站点对知识体系进行分享。

博客地址: 

CSDN: 

微信公众号: