6

@Inject在 Spring 的工作中有一些奇怪的行为。这个例子效果很好:

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

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

但是如果我替换@Autowired@InjectshowHome方法会抛出NullPointerException,因为someBeanis null。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>
4

1 回答 1

4

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

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

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

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

还可以查看这篇关于为什么场注入是邪恶的帖子。

于 2016-09-12T08:27:31.440 回答