Spring 引导自动装配失败 - 空
Spring Boot Autowired failed - null
我有 3 个 类,它们位于 spring 启动应用程序的不同包中,如下所示:
为什么 @Autowired
仅在某些 类 中有效?我做错了什么吗?
@Configuration
public class Configurations{
@Autowired
Prop prop; //works fine
@Bean
//other bean definitions
}
@Component
public class Prop{
public void method(){};
}
public class User{
@Autowired
Prop prop; //does not work, null
public void doWork(){
prop.method();
}
}
我也试过@PostConstruct
,但结果一样
public class User{
@Autowired
Prop prop; //does not work, null
@PostConstruct
public void doWork(){
prop.method();
}
}
只有当 Spring 检测到 class 本身应该是一个 Spring bean 时,@Autowired
注释才起作用。
在您的第一个示例中,您使用 @Configuration
注释对 Configurations
进行了注释。另一方面,您的 User
class 没有说明它应该是 Spring bean 的注释。
有多种注释(具有不同的含义)可以使您的 class 被 Spring 容器拾取,例如 @Service
、@Component
、@Controller
, @Configuration
, ...但是,这仅在您的 class 位于由 Spring 容器扫描的包裹中时有效。使用 Spring 引导,最简单的保证方法是将 User
class 放在主 class 的(子)包中(class 注释@SpringBootApplication
).
您也可以通过在 Configurations
中编写以下方法来手动创建您的 bean:
@Bean
public User user() {
return new User();
}
在这种情况下,您不必注释您的 User
class,也不必确保它在被扫描的包裹中。
我有 3 个 类,它们位于 spring 启动应用程序的不同包中,如下所示:
为什么 @Autowired
仅在某些 类 中有效?我做错了什么吗?
@Configuration
public class Configurations{
@Autowired
Prop prop; //works fine
@Bean
//other bean definitions
}
@Component
public class Prop{
public void method(){};
}
public class User{
@Autowired
Prop prop; //does not work, null
public void doWork(){
prop.method();
}
}
我也试过@PostConstruct
,但结果一样
public class User{
@Autowired
Prop prop; //does not work, null
@PostConstruct
public void doWork(){
prop.method();
}
}
只有当 Spring 检测到 class 本身应该是一个 Spring bean 时,@Autowired
注释才起作用。
在您的第一个示例中,您使用 @Configuration
注释对 Configurations
进行了注释。另一方面,您的 User
class 没有说明它应该是 Spring bean 的注释。
有多种注释(具有不同的含义)可以使您的 class 被 Spring 容器拾取,例如 @Service
、@Component
、@Controller
, @Configuration
, ...但是,这仅在您的 class 位于由 Spring 容器扫描的包裹中时有效。使用 Spring 引导,最简单的保证方法是将 User
class 放在主 class 的(子)包中(class 注释@SpringBootApplication
).
您也可以通过在 Configurations
中编写以下方法来手动创建您的 bean:
@Bean
public User user() {
return new User();
}
在这种情况下,您不必注释您的 User
class,也不必确保它在被扫描的包裹中。