在Spring中使用@Inject进行现场注入

Vit*_*nko 6 java spring spring-mvc jsr330

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

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

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

但是,如果我取代@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>
Run Code Online (Sandbox Code Playgroud)

Ali*_*ani 4

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

<dependency>
    <groupId>javax.inject</groupId>
    <artifactId>javax.inject</artifactId>
    <version>1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

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

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

另请查看这篇文章,了解为什么现场注入是邪恶的