@Autowired创建null对象,尽管@configuration

时间:2017-09-11 12:40:35

标签: 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));
        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注释创建一个实例 我做错了什么?

4 个答案:

答案 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。