1.11 使用JSR 330标准注释


从Spring 3.0开始,Spring提供了对JSR-330标准注释(依赖项注入)的支持。这些注释的扫描方式与Spring注释相同。您只需要在类路径中有相关的jar即可。

如果您正在使用Maven,即javax。inject工件可以在标准Maven存储库中获得(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。您可以将以下依赖项添加到您的文件pom.xml:

<dependency>
       <groupId>javax.inject</groupId>
       <artifactId>javax.inject</artifactId>
       <version>1</version>
</dependency>

1.11.1 使用@Inject和@Named进行依赖项注入

相比于@Autowired,@javax.inject.Inject使用方法如下:

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(...);
                ...
        }
}

与@Autowired一样,可以在字段级、方法级和构造参数级使用@Inject。此外,您可以将注入点声明为提供者,从而允许按需访问范围较短的bean,或者通过Provider.get()调用对其他bean进行延迟访问。作为上述例子的一个变体:

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

public class SimpleMovieLister {

        private Provider<MovieFinder> movieFinder;

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

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

如果您想为应该注入的依赖项使用限定名,您应该使用@Named注释,如下所示:

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;
        }

        // ...
}

1.11.2 @Named和@ManagedBean:与@Component注释等价的标准

相比于@Component,@javax.inject.Named或javax.annotation.ManagedBean使用方法如下:

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;
        }

        // ...
}

在不指定组件名称的情况下使用@Component是非常常见的。@ name可以以类似的方式使用:

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

@Named
public class SimpleMovieLister {

        private MovieFinder movieFinder;

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

        // ...
}

当使用@Named或@ManagedBean时,可以像使用Spring注释一样使用组件扫描:

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

与@Component相反,JSR-330 @Named和JSR-250 ManagedBean注释是不可组合的。请使用Spring的原型模型来构建自定义组件注释。

1.11.3 JSR-330标准注释的限制

当使用标准注释时,重要的是要知道一些重要的特性是不可用的,如下表所示:

Springjavax.inject.*javax.inject restrictions / comments
@Autowired@Inject@Inject没有“required”属性;可以与Java 8的Optional一起使用。
@Component@Named / @ManagedBeanJSR-330不提供可组合模型,只是一种识别命名组件的方法。
@Scope(“singleton”)@SingletonJSR-330默认范围类似于Spring的原型。但是,为了使它与Spring的一般缺省值保持一致,在Spring容器中声明的JSR-330 bean在缺省情况下是单例的。为了使用单例之外的范围,您应该使用Spring的@Scope注释。javax。inject还提供一个@Scope注释。不过,本文仅用于创建您自己的注释。
@Qualifier@Qualifier / @Namedjavax.inject。限定符只是用于构建自定义限定符的元注释。具体的字符串限定符(比如Spring的@Qualifier和一个值)可以通过javax.inject.Named关联起来。
@Value-no equivalent
@Required-no equivalent
@Lazy-no equivalent
ObjectFactoryProviderjavax.inject。Provider是Spring的ObjectFactory的直接替代品,只是使用了更短的get()方法名。它还可以与Spring的@Autowired结合使用,或者与非带注释的构造函数和setter方法结合使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值