20191226 Spring官方文档(Core 1.11)

本文内容纲要:

- 1.11。使用JSR 330标准注释

- 1.11.1。使用@Inject和@Named的依赖注入

- 1.11.2。@Named和@ManagedBean:@Component注释的标准等效项

- 1.11.3。JSR-330标准注释的局限性

1.11。使用JSR 330标准注释

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

<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。此外,您可以将注入点声明为 Provider,以允许按需访问作用域更小的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;

}

// ...

}

@Autowired一样,@Inject也可以与java.util.Optional@Nullable一起使用。这在这里更为适用,因为@Inject没有required属性。以下示例展示了如何使用@Inject和 @Nullable:

public class SimpleMovieLister {

@Inject

public void setMovieFinder(Optional<MovieFinder> movieFinder) {

// ...

}

}

public class SimpleMovieLister {

@Inject

public void setMovieFinder(@Nullable MovieFinder movieFinder) {

// ...

}

}

1.11.2。@Named和@ManagedBean:@Component注释的标准等效项

您可以使用@javax.inject.Namedjavax.annotation.ManagedBean代替@Component,如以下示例所示:

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;

}

// ...

}

@Named可以不指定组件名称

当使用@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的prototype。但是,为了使其与Spring的默认默认值保持一致,默认情况下,在Spring容器中声明的JSR-330 bean是singleton。为了使用singleton之外的作用域,您应该使用Spring的@Scope注释。javax.inject还提供了@Scope批注。不过,此仅用于创建自己的注释。
@Qualifier@Qualifier / @Namedjavax.inject.Qualifier只是用于构建自定义限定符的元注释。具体的String限定词(例如带有值的Spring的@Qualifier)可以通过javax.inject.Named关联。
@Value-没有等效
@Required-没有等效
@Lazy-没有等效
ObjectFactoryProviderjavax.inject.Provider是Spring的ObjectFactory直接替代方法,只是get()方法名称较短。它也可以与Spring @Autowired或非注释构造函数和setter方法结合使用。

本文内容总结:1.11。使用JSR 330标准注释,1.11.1。使用@Inject和@Named的依赖注入,1.11.2。@Named和@ManagedBean:@Component注释的标准等效项,1.11.3。JSR-330标准注释的局限性,

原文链接:https://www.cnblogs.com/huangwenjie/p/12104049.html

以上是 20191226 Spring官方文档(Core 1.11) 的全部内容, 来源链接: utcz.com/z/296425.html

回到顶部