在 Spring 中使用 @Inject 进行字段注入

Field injection with @Inject in Spring

我在 Spring 中处理 @Inject 时出现一些奇怪的行为。 这个例子运行良好:

@Controller
@RequestMapping("/")
public class HomeController {
    @Autowired
    private SomeBean someBean;

    @RequestMapping(method = GET)
    public String showHome() {
        System.out.println(someBean.method());
        return "home";
    }
}

但是如果我用 @Inject 替换 @AutowiredshowHome 方法将抛出 NullPointerException 因为 someBeannull。 setter 注入也是一样。但是通过构造函数注入,@Autowired@Inject 都能正常工作。

为什么会这样?

我正在使用 Spring 4.3.1。 我在 pom.xml 中的依赖项如下所示:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>7.0</version>
        <scope>provided</scope>
    </dependency>
<dependencies>

Spring支持JSR-330标准注解,你只需要将相关的jar放到你的类路径中即可。如果您使用的是 Maven,请将以下内容添加到您的 pom.xml:

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

为什么构造函数注入有效?

Spring 4.3开始,不再需要指定@Autowired注解如果目标bean只定义一个构造函数。由于您只有一个构造函数,因此无论您使用哪个注释,都将注入所需的依赖项。

也在 why field injection is evil 上查看此 post。