Java 依赖注入标准(JSR-330,Dependency Injection for Java)主要是面向依赖注入使用者,而对注入器实现、配置并未作详细要求。

从Spring 3.0开始,Spring开始支持JSR-330标准的注解(依赖注入)。这些注解和Spring注解扫描的方式是一直的。

我们先来添加JSR-330标准API的依赖

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

这里给大家介绍两个注解。

  • @Named

    和Spring的@Component类似

  • @ Inject

    和Spring的@Autowired类似

下面我们看具体的例子

package componentscan;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.inject.Inject;
import javax.inject.Named;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Named
public class ComponentDAO {
	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Inject
	ComponentJdbcConnection jdbcConnection;

	public ComponentJdbcConnection getJdbcConnection() {
		return jdbcConnection;
	}

	public void setComponentJdbcConnection(ComponentJdbcConnection jdbcConnection) {
		this.jdbcConnection = jdbcConnection;
	}

	@PostConstruct
	public void postConstruct() {
		logger.info("postConstruct");
	}

	@PreDestroy
	public void preDestroy() {
		logger.info("preDestroy");
	}
}

下面是一个Spring和依赖注入标准的一个比较。

Springjavax.inject.*javax.inject 限制/注释
@Autowired@Inject@Inject 没有'required'属性
@Component@Named
@Scope("singleton")@Singletonjsr-330 默认范围和 Spring 的 prototype 相似。但是,要保持和 Spring 一般默认值一致,在 Spring 容器中 jsr-330 的 bean 声 明默认是 singleton 的。要使用另外的 范围,你应该使用 Spring 的@Scope 注解。javax.inject 也提供@Scope 注解。不过这仅 仅用于创建你自己的注解。
@Qualifier@Named
@Value-不等同
@Required-不等同
@Lazy-不等同