Using JSR 330 Standard Annotations

##7.11 Using JSR 330 Standard Annotations 从spring3.0开始,spring提供对JSR-330标准注解的支持.这些注解同spring注解的扫描方式相同.你只需将在你的类路径里添加相关的jar包.

如果你使用Maven,那么java.inject产品可以在标准的Maven仓库获得.你可以将以下依赖加到你的pom.xml文件里:

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

###7.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注解可以在字段级别,方法级别,构造器参数级别使用.还有,你可以申明一个注入点作为Provider,允许你通过Provider.get()方法的调用,按需在更小的作用域得到beans或者懒加载获取其他bean.一个变种如下:

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

public class SimpleMovieLister {

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

    // ...
}

###7.11.2 @Named And @ManagedBean :standard equivalents to the @Component annotation (@componet 注解的等价注解) 同@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经常不指定一个组件的名称就进行使用.@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;
    }

    // ...
}
  • 可以同@Component一样定义扫描路径
@Configuration
@ComponentScan(basePackages = "org.example")
public class AppConfig  {
    ...
}

注:与@Component相比,JSR-330的Named注解和JSR-250的ManagedBean注解无法被组合.你可以使用spring的模板类型模式来创建自定义组件注解. ###7.11.3 JSR-330标准注解的局限性 当你使用标准注解时,了解下面列表中展示的它们局详性是非常重要的:

@Autowired -->@Inject @Inject没有"required"属性,但可以使用java 8的Optional来替代;

@Component-->@Named/@ManagedBean JSR-330无法提供组合模型的功能,只是一种标志名称组件的方式 @Scope("singleton")-->@Singleton JSR-330默认的作用域同spring的protype相同.但是,为了同spring的基本默认保持一致,在spring容器里的jsr-330的bean默认都是单例.为了使用非单例的作用域,你可以使用spring的@Scope作用域.这个注解只用于创建自己的注解时使用.

@Qualifier-->@Qualifier/@Named javax.inject.Qualfier是一个创建自定义匹配符的元注解.它可以和javax.inject.Named协同来组合字符串匹配符

@Value-->无 @Required -->无 @Lazy-->无 @ObjectFactory-->Provider javax.inject.Provider是spring的ObjectFactory的替代,它有一个get()方法.它可以同spring的Autowired注解或者没有注解的构造器或set方法一起使用.

转载于:https://my.oschina.net/u/1590027/blog/751838

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值