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();
}
}