繁体   English   中英

在春季使用@Inject进行现场注入

[英]Field injection with @Inject in Spring

我在春季使用@Inject有一些奇怪的行为。 这个例子很好用:

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

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

但是,如果我将@Autowired替换为@Inject ,则showHome方法将抛出NullPointerException因为someBeannull 与二传手注射相同。 但是通过构造函数注入,@ @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开始如果目标bean只定义一个构造函数 ,则不再需要指定@Autowired注释。 由于您只有一个构造函数,因此无论您使用哪种注释,都将注入必需的依赖项。

还可以查看这篇文章, 了解为何电场注入是邪恶的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM