我有以下配置类
@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()时FreeMarkerService f = new FreeMarkerService()
f.process()
我得到一个null异常,因为配置Object为null
我想使用@Autowired和@Configuration注释创建一个实例 我做错了什么?
答案 0 :(得分:4)
您应该使用Spring实例化的FreeMarkerService
对象,避免对控制器或服务等对象使用new
关键字。
例如,
@Service
public class SampleService {
@Autowired
private FreeMarkerService freeMarkerService;
public String callProcess() {
return freeMarkerService.process();
}
}
您可以在许多帖子中找到更多详细信息,例如this。
答案 1 :(得分:2)
这是会员注射:
@Autowired
private static Configuration configuration;
从构造函数中实例化bean之后会执行哪个spring。所以当你制作静态方法时,调用spring没有注入值。
答案 2 :(得分:1)
这是因为您正在尝试自动装配静态字段。这在春天是不可能的。从Configuration属性中删除静态,它应该可以工作。
@Autowired
private Configuration configuration;
答案 3 :(得分:1)
@Autowired
private static Configuration configuration;
为什么要自动装配静态字段?这就是原因。静态成员加载为类定义加载,因此它不会获取注入值并获取默认值null。