您的位置:首页 > 编程语言 > Java开发

Spring核心技术(十)——JSR-330标准注解

2016-07-11 12:32 537 查看
从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的,开发者只需要在classpath中配置相关的jar包即可。

如果开发者使用Maven来管理项目的话,
javax.inject
artifact在Maven仓库中是可用的(http://repo1.maven.org/maven2/javax/inject/javax.inject/1/)。开发者只需要在pom中引用这个依赖即可。

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


通过
@Inject
@Named
进行依赖注入

JSR-330中,
@javax.inject.Inject
和Spring中的
@Autowired
的职责相同:

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
在实例变量,方法以及构造参数级别来使用依赖注入。而且,开发者可以将注入声明为
Provider
,通过
Provider.get()
来请求那些短作用域或者延迟初始化的Bean。比如如下的例子:

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

public class SimpleMovieLister {

private Provider<MovieFinder> movieFinder;

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


如果开发者希望来通过名字来限定注入的Bean,可以使用
@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;
}

// ...
}


@Named
:等同于
@Component
注解

JSR-330中,
@javax.inject.Named
和Spring中的
@Component
的职责类似:

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

@Named("movieListener")
public class SimpleMovieLister {

private MovieFinder movieFinder;

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

// ...
}


@Component
的使用中经常是不需要指定名字的,
@Named
注解也是如此:

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
注解的时候,也同样可以使用组件扫描:

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


和Spring的
@Component
组件不同的是,JSR-330的
Named
注解不可以组合来使用,如果希望自定义组件注解的话,还请使用Spring的组件注解。

JSR-330标准注解的限制

当使用JSR-330标准的注解时,了解其和Spring注解的不同点也是十分必要的,参考如下表:

Springjavax.inject.*javax.inject 限制
@Autowired@Inject
@Inject
注解没有
required
属性,但是可以通过Java 8的
Optional
取代
@Component@NamedJSR_330标准并没有提供复合的模型,只有一种方式来识别组件
@Scope(“singleton”)@SingletonJSR-330默认的作用域类似Spring的
prototype
,然而,为何和Spring的默认保持一致,JSR-330标准中的Bean在Spring中默认也是单例的。如果要使用非单例的作用域,开发者应该使用Spring的
@Scope
注解。
java.inject
也提供一个
@Scope
注解,然而,这个注解仅仅可以用来创建自定义的作用域时才能使用。
@Qualifier@Qualifier/@Named
javax.inject.Qualifier
仅仅是一个元注解,用来构建自定义限定符的。而String的限定符(比如Spring中的
@Qualifier
)可以通过
javax.inject.Named
来实现
@Value-不等价
@Required-不等价
@Lazy-不等价
ObjectFactoryProvider
javax.inject.Provider
是Spring
ObjectFactory
的另一个选择,通过
get()
方法来代理,
Provider
可以和Spring的
@Autowired
组合使用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring JSR-330 Named Inject