为使用 Java 配置创建的自动装配 bean 获取空值
Getting null for Autowired bean created using Java config
我正在 Spring 引导中创建 REST 服务。我正在配置 class 中创建一个 bean 并尝试通过自动连接在服务 class 中使用,但我总是得到 null,我也尝试过构造函数注入但没有工作。下面是代码,
主应用程序
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
REST 控制器
@RestController
@RequestMapping("/v1")
public class RestController {
@Autowired
private Service service;
服务
@Service
public class ServiceImpl implements Service {
//This is the bean
@Autowired
private Record record;
public ServiceImpl() { //-----------------> tried injecting in constructor as well
System.out.println(record); //-------------------> null
}
配置class
@Configuration
public class AppConfig {
@Bean
public Record record() {
return new Record("test");
}
}
我注意到每当我从配置中删除 record() 时 class 我得到以下错误
required a bean of type 'com.ns.service.Record' that could not be found
并且添加方法后不报错,返回null,间接表示record()被认为是返回了需要的bean。
我找不到我做错了什么,请指教。
项目文件夹结构
我认为你在概念上做的一切都是正确的
Spring 首先创建一个对象,然后才注入值(技术上在 bean post 处理器中完成):
所以试试这个:
@Service
public class ServiceImpl implements Service {
//This is the bean
@Autowired
private Record record;
public ServiceImpl() {
// here the record is null - not injected yet
System.out.println(record);
}
@PostConstruct
public void checkThisOut() {
// here print the record
}
您说您也尝试过构造函数注入 - 它应该可以工作,因为 spring 必须将某些东西注入到 bean (ServiceImpl) 的构造函数中,否则就会失败。请显示代码片段
其中一个在某种程度上可能是错误的(尽管从您的描述中听起来不像这样)是您必须将所有 @Configuration
/@Service
注释为 classes 在相同的包中或在您创建主 class 并使用 @SpringBootApplication
注释的包下方。它指示 spring 启动到哪里寻找 bean。
因此请确保您的 class 遵守此规则...
我正在 Spring 引导中创建 REST 服务。我正在配置 class 中创建一个 bean 并尝试通过自动连接在服务 class 中使用,但我总是得到 null,我也尝试过构造函数注入但没有工作。下面是代码,
主应用程序
@SpringBootApplication
public class Main {
public static void main(String[] args) {
SpringApplication.run(Main.class, args);
}
}
REST 控制器
@RestController
@RequestMapping("/v1")
public class RestController {
@Autowired
private Service service;
服务
@Service
public class ServiceImpl implements Service {
//This is the bean
@Autowired
private Record record;
public ServiceImpl() { //-----------------> tried injecting in constructor as well
System.out.println(record); //-------------------> null
}
配置class
@Configuration
public class AppConfig {
@Bean
public Record record() {
return new Record("test");
}
}
我注意到每当我从配置中删除 record() 时 class 我得到以下错误
required a bean of type 'com.ns.service.Record' that could not be found
并且添加方法后不报错,返回null,间接表示record()被认为是返回了需要的bean。 我找不到我做错了什么,请指教。
项目文件夹结构
我认为你在概念上做的一切都是正确的
Spring 首先创建一个对象,然后才注入值(技术上在 bean post 处理器中完成):
所以试试这个:
@Service
public class ServiceImpl implements Service {
//This is the bean
@Autowired
private Record record;
public ServiceImpl() {
// here the record is null - not injected yet
System.out.println(record);
}
@PostConstruct
public void checkThisOut() {
// here print the record
}
您说您也尝试过构造函数注入 - 它应该可以工作,因为 spring 必须将某些东西注入到 bean (ServiceImpl) 的构造函数中,否则就会失败。请显示代码片段
其中一个在某种程度上可能是错误的(尽管从您的描述中听起来不像这样)是您必须将所有 @Configuration
/@Service
注释为 classes 在相同的包中或在您创建主 class 并使用 @SpringBootApplication
注释的包下方。它指示 spring 启动到哪里寻找 bean。
因此请确保您的 class 遵守此规则...