在 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
替换 @Autowired
,showHome
方法将抛出 NullPointerException
因为 someBean
是 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>
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。
我在 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
替换 @Autowired
,showHome
方法将抛出 NullPointerException
因为 someBean
是 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>
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。