Java @自动连线创建空对象inspite@configuration

Java @自动连线创建空对象inspite@configuration,java,spring,dependency-injection,Java,Spring,Dependency Injection,我有以下配置类 @org.springframework.context.annotation.Configuration public class TemplateConfiguration { @Bean public Configuration configuration() { Configuration configuration = new Configuration(new Version(2, 3, 23)); configura

我有以下配置类

@org.springframework.context.annotation.Configuration
public class TemplateConfiguration {

    @Bean
    public Configuration configuration() {
        Configuration configuration = new Configuration(new Version(2, 3, 23));
        configuration.setClassForTemplateLoading(TemplateConfiguration.class, "/templates/");
        configuration.setDefaultEncoding("UTF-8");
        configuration.setLocale(Locale.US);
        configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
        return configuration;
    }
}
我在下面的@service中使用它

@Service
public class FreeMarkerService {

    @Autowired
    private Configuration configuration;

    private static final Logger logger = LoggerFactory.getLogger(FreeMarkerService.class);

    public String process() {
        try {
            Template template = configuration.getTemplate("someName");
            ....
        } catch (IOException | TemplateException e) {
            logger.error("Error while processing FreeMarker template: " + e);
            throw new RuntimeException(e);
        }
    }
}
但是当我尝试调用process()时

由于配置对象为null,我得到一个null异常

我想使用@Autowired和@Configuration注释创建一个实例
我做错了什么?

这是因为您试图自动关联静态字段。这在春天是不可能的。从配置属性中删除static,它应该可以工作

@Autowired
private Configuration configuration;

为什么自动连接静态场?这就是原因。静态成员加载为类定义加载,因此不会获取注入值,也不会获取默认值(null)。

这是一个成员注入:

@Autowired
private static Configuration configuration;

spring在从其构造函数实例化bean之后执行的操作。因此,在进行静态方法调用时,spring没有注入值。

您应该使用spring实例化的
FreeMarkerService
对象,尽可能避免对控制器或服务等对象使用
new
关键字

比如说,

@Service
public class SampleService {

    @Autowired
    private FreeMarkerService freeMarkerService;

    public String callProcess() {
        return freeMarkerService.process();
    }
}

更多细节可以在许多帖子中找到,比如。

那么,我该怎么办?原因即使在删除静态修饰符之后,spring也不会创建配置类,并且配置仍然为nullremoved static,仍然为nullcheck您的配置类被正确注入,并停止使用new进行实例化。
@Autowired
private static Configuration configuration;
@Service
public class SampleService {

    @Autowired
    private FreeMarkerService freeMarkerService;

    public String callProcess() {
        return freeMarkerService.process();
    }
}